这是一个初学者的问题,所以我对此深表歉意(以前从未使用过 Python,但必须尽快修改现有脚本)。
我尝试为许多网页制作屏幕截图。进展顺利,但我注意到即使链接不同,有时也会出现重复。似乎需要为此使用 QTimer 并且简单的超时解决方案不起作用。我以前有过:
1)Screenshot
具有capture
将 Web 链接作为参数的方法的类
2) 一个实例并多次Screenshot
调用,同时循环遍历 main 中的 Web 链接列表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,这让我觉得我宁愿提前收集所有 url 并制作一个 Screenshot 实例,我也只会调用一次。因此,我应该遍历初始化块中的 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_()