1

这是一个初学者的问题,所以我对此深表歉意(以前从未使用过 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_()
4

0 回答 0