我曾经使用python写过一个刮刀,它在命令行中工作正常。我现在为应用程序制作了一个GUI,但是我遇到了一个问题。当我尝试更新gui中的文本时(例如'获取URL 12/50'),我无法看到刮板中的功能正在抓取100多个链接。此外,当从一个抓取功能转到应该更新gui的函数到另一个函数时,在运行下一个scrape函数时似乎跳过了gui update函数。一个例子是:
scrapeLinksA() #takes 20 seconds
updateInfo("LinksA done")
scrapeLinksB() #takes another 20 seconds
在上面的例子中,从不执行updateInfo,除非我用KeyboardInterrupt结束程序。
我认为我的解决方案是线程,但我不确定。我该怎么做才能解决这个问题?
我正在使用:
答案 0 :(得分:2)
我建议使用QNetworkAccessManager
以非阻止方式下载网站。这是一种不同的方法,因此您可能会重写应用程序的处理部分。您可以使用多个较小的功能,通过信号连接而不是等待页面下载以便您可以解析它,并在某些事件发生时执行(例如“下载页面”)。
答案 1 :(得分:2)
LukášLalinský的回答非常好。
另一种可能性是使用PyQt threads。
如果问题仅仅是“更新”部分(而不是异步处理的需要),请尝试进行此调用:
QCoreApplication.processEvents()
在scrapeLinksA
和scrapeLinksB
之间以查看是否有帮助(它会暂时中断主事件循环,以查看是否有其他(绘制请求,例如)待处理。)
如果没有,请向我们提供updateInfo
的来源。