PyQt4,阻止app.exec_()挂起主线程

时间:2016-02-29 17:24:15

标签: python pyqt pyqt4

我有一些简单的代码可以使用PyQt4库加载google.com 这是代码:

import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebView

class Browser(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        self.loadFinished.connect(self._result_available)

    def _result_available(self, ok):
        frame = self.page().mainFrame()
        #print(frame.toHtml())
        app.exit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    view = Browser()
    view.load(QUrl('http://www.google.com'))
    print('start')
    app.exec_()#hangs the main thread
    print('end')

我对此代码的问题是app.exec_()在打印开始和打印结束之间暂停主线程一段时间。
有没有办法在PyQt4中抓取一个网站,而不会让主线程暂停一段时间 我想在app.exec_()之后恢复主线程正常执行的代码。

1 个答案:

答案 0 :(得分:0)

可能只是花时间从网上下载内容。 app.exec_()基本上是运行您的应用程序的。因此,如果确实存在任何问题,那么实际上是影响应用程序正确执行的其他因素。关闭应用程序后,将执行app.exec_()之后的任何语句。通常在app.exec_()的末尾调用main(在C ++中你做return app.exec_(),当然你也可以在PyQt中做。)

在处理需要时间下载并在UI中显示的内容时,您必须添加多线程以允许主线程继续正常工作(因此不会创建所谓的 UI冻结)但同时在后台做一些工作。主线程的唯一目的是跟踪UI并运行它。您添加到主线程的任何其他内容都将阻止UI以流畅的方式工作。这里有几个选项 - 继承QThread(我不建议特别针对这种情况做这件事),使用QThread + QObject在应用程序中合并插槽和信号(例如:页面下载? - >如果是,则通知UI显示内容),QRunnable等。

所以我的建议是在单独的线程中下载内容,一旦完成,您可以将其添加到UI以及提供其他形式的视觉反馈(这还包括print语句:P)。