编写脚本以将任意HTML呈现为图像,并使用PyQt。我很困惑为什么我的QApplication.exit
电话没有让QApplication.exec_
返回。关于这个的任何想法?
class ScreenshotterApplication(QApplication):
def __init__(self, args, html):
QApplication.__init__(self, args)
self.html = html
self.browser = QWebView()
self.browser.resize(0, 0)
self.browser.loadFinished.connect(self.save)
self.browser.loadProgress.connect(self.progress)
def render(self):
self.browser.setHtml(self.html)
def progress(self, progress):
print '%d%%' % progress
def save(self, finished):
success = False
if finished:
print 'saving...'
# ... snip ...
success = pixmap.save('screenshot.png')
if success:
print 'saved as "screenshot.png"'
QApplication.exit(0 if success else 1)
def exec_(self, *args, **kwargs):
self.render()
super(QApplication, self).exec_(*args, **kwargs)
def take_screenshot(html):
app = ScreenshotterApplication(sys.argv, html)
return app.exec_()
if __name__ == "__main__":
print take_screenshot('<h1 style="width: 500px">Hello, World!</h1>')
答案 0 :(得分:4)
QApplication.exit
告诉应用程序离开主事件循环,即尽快从exec_()
返回。
你的问题是,静态HTML的一小部分很容易检索和渲染,QtWebKit在调用setHtml时正确。没有延迟或后台处理,一切都在setHtml返回之前完成。因此,在主循环开始之前(即在调用save
之前),exec_
被称为。
就像你不在函数中时编写return
一样 - 除非循环没有运行,否则Qt会静静地忽略exit
。
解决方案:在connect
调用中使用QueuedConnection
强制信号排队,并在事件循环开始时传递。当然,如果循环 已经在运行,这也会起作用。
self.browser.loadFinished.connect(self.save, Qt.QueuedConnection)