等待延迟,然后使用PyQt捕获网站图像

Max*_*ony 4 python flash macos qt pyqt

我正在使用PyQt(作为Python初学者).我需要能够在无头系统上截取网站的屏幕截图.我之前使用的是PhantomJS用于另一个项目,但他们在1.5中删除了Flash支持,我不想依赖于我的新项目弃用的1.4版本.

所以我正在使用PyQt自己做我的东西.我可以用一个给定的网址截取一个网站的截图,没问题.

但我一直在Flash占位符上有"蓝色骰子"flash插件图标(是的,javascript和插件被激活)

self.settings.setAttribute(QtWebKit.QWebSettings.PluginsEnabled,True) 
self.settings.setAttribute(QtWebKit.QWebSettings.JavascriptEnabled,True) 
Run Code Online (Sandbox Code Playgroud)

我正在Youtube视频页面上进行一些测试,这是我的问题的一个例子:

图片

第二部分,可能与第一部分有关:如何告诉PyQt在拍摄截图之前等待几秒钟?正如您在示例中看到的那样,右侧的图像仍然被卸载,因为它们是使用javascript和data属性加载的,在我的脚本中,我在loadFinished信号(onLoad()等效的javascript)上截取屏幕截图.

我的第一个猜测就是

time.sleep(2) 
Run Code Online (Sandbox Code Playgroud)

在调用我的捕获方法之前,它不起作用.我假设在这个休眠时间内Webkit加载也处于睡眠状态,防止在页面上加载任何内容.

我试图创建一个自定义信号,但后来我仍然不知道如何在不睡觉的情况下触发它.

我的最后一个猜测是我需要线程化我的应用程序.我对吗?

如果您有任何提示/脚本来帮助我显示Flash内容和/或添加类似信号的setTimeout,我将非常感激!

在此先感谢您的帮助.

编辑: 只需快速编辑即可添加我的解决方案:

timeoutTimer = QTimer()
timeoutTimer.setInterval(3000) # wait for 3secs
timeoutTimer.setSingleShot(True)
timeoutTimer.timeout.connect(theMethodToCallOnTimeout)
Run Code Online (Sandbox Code Playgroud)

关于flash事物:看起来像OSX上的flash播放器坏了(可能与32/64位问题有关).

小智 5

如果time.sleep你是冻结整个应用程序,而不是,您可以使用QTimer,QEventLoop,QThread等这里是PyQt4的版本:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class browser(QWebView):
    def __init__(self, parent=None):
        super(browser, self).__init__(parent)

        self.timerScreen = QTimer()
        self.timerScreen.setInterval(2000)
        self.timerScreen.setSingleShot(True)
        self.timerScreen.timeout.connect(self.takeScreenshot)

        self.loadFinished.connect(self.timerScreen.start)
        self.load(QUrl("http://www.google.com/ncr"))    

    def takeScreenshot(self):    
        image   = QImage(self.page().mainFrame().contentsSize(), QImage.Format_ARGB32)
        painter = QPainter(image)

        self.page().mainFrame().render(painter)

        painter.end()
        image.save(self.title() + ".png")

        sys.exit()

if __name__ == "__main__":
    import  sys        
    app  = QApplication(sys.argv)
    main = browser()
    app.exec_()
Run Code Online (Sandbox Code Playgroud)

QWebView截图