我有一些简单的代码可以使用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_()
之后恢复主线程正常执行的代码。
答案 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)。