这是一个初学者的问题所以我真的为此道歉(之前从未使用过Python,但必须尽快修改现有脚本)。
我尝试为许多网页制作屏幕截图。它一直很顺利,但我注意到即使链接不同,我有时会得到重复。似乎需要使用QTimer,而简单的超时解决方案是行不通的。我以前有过:
1)使用Screenshot
方法的capture
类将网页链接作为参数
2)Screenshot
的一个实例,并在主要
capture(url)
现在我必须使用QTimer
,我到目前为止看到的所有示例都将它放在__init__
中,这就像
self.timerScreen = QTimer()
self.timerScreen.setInterval(1000)
self.timerScreen.setSingleShot(True)
self.timerScreen.timeout.connect(self.capture)
self.loadFinished.connect(self.timerScreen.start)
self.load(QUrl(url))
我必须在初始化时传递网址(def __init__(self, urlLst, parent=None)
),这让我觉得我提前收集所有网址并制作一个屏幕截图实例,我也只会调用一次。因此,我应该在初始化块中循环遍历URL并在那里调用捕获。毋庸置疑,我显然未能做得好,capture
甚至没有被召唤。 (我也尝试了一种替代方案 - 每个链接创建一个实例 - 但在那里也没有太大的成功)。关于如何解决它的任何想法?非常感谢你提前!
class Screenshot(QWebView):
def __init__(self, urlLst, webidLst, parent=None):
super(Screenshot, self).__init__(parent)
self.timerScreen = QTimer()
self.timerScreen.setInterval(1000)
self.timerScreen.setSingleShot(True)
for index, item in enumerate(urlLst):
self.url = item
self.webid = webidLst[index]
self.output_file = self.webid + ".png"
self.timerScreen.timeout.connect(self.capture)
self.loadFinished.connect(self.timerScreen.start)
self.load(QUrl(self.url))
def capture(self):
frame = self.page().mainFrame()
self.page().setViewportSize(frame.contentsSize())
# render image
image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
if image.isNull() is False:
painter = QPainter(image)
frame.render(painter)
painter.end()
print '\n for webid=' + str(self.webid) + '\t for web page=' + str(self.url)
print ' saving ', self.output_file
image.save(self.output_file)
# In main:
# store all links in LinkLst and their ids in webpageidLst
app = QApplication(sys.argv)
s = Screenshot(linkLst, webpageidLst)
app.exec_()