2010-05-02 88 views
0

我寫了一個使用python的刮板,而且它在命令行中工作正常。我現在爲應用程序製作了一個GUI,但是我遇到了一個問題。當我嘗試更新gui內部的文本時(例如'抓取URL 12/50'),我無法看到刮板內的功能抓取了100多個鏈接。另外,當從一個抓取函數,到一個應該更新gui的函數,到另一個函數時,gui更新函數似乎在下一個scrape函數運行時被跳過。一個例子是:Python GUI刮板懸掛問題

scrapeLinksA() #takes 20 seconds 
updateInfo("LinksA done") 
scrapeLinksB() #takes another 20 seconds 

在上面的例子中,updateInfo從不執行,除非我用KeyboardInterrupt結束程序。

我在想我的解決方案是線程化的,但我不確定。我能做些什麼來解決這個問題?

我使用:

  • PyQt4的
  • 的urllib2
  • BeautifulSoup

回答

2

LukášLalinský的回答非常好。

另一種可能性是使用PyQt threads

如果問題僅僅是「更新」的一部分(而不是需要異步處理),可以嘗試在此呼籲:scrapeLinksAscrapeLinksB之間

QCoreApplication.processEvents() 

,看看有沒有什麼幫助(它暫時中斷主要事件循環來查看是否有其他(繪畫請求)等待)。

如果不是這樣,請給我們提供updateInfo的來源。

2

我建議使用QNetworkAccessManager下載網站的非阻塞方式。這是一種不同的方法,因此您可能會重寫應用程序的處理部分。您不必等到下載頁面才能解析它,而是通過信號連接多個較小的函數,並在發生某些事件時執行它們(例如,「下載頁面」)。