2015-09-18 27 views
0

我一直工作在一個非常簡單的腳本,獲取職稱問題從Python標籤的計算器,並將其顯示在QTextBrowser。WebScrapping,PyQt的

該應用程序按預期工作(至少在開始時),但窗口不顯示,直到它完成加載網頁和刷新按鈕凍結程序,直到它加載太多有沒有辦法解決這個問題?以下是完整的代碼:

#! usr/bin/env python 

from PyQt4.QtGui import * 
import requests 
from bs4 import BeautifulSoup 
import lxml 
from threading import Thread 

class Form(QWidget): 
    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 

     self.url = "http://www.stackoverflow.com/questions/tagged/python" 

     self.browser = QTextBrowser() 
     self.connectionlabel = QLabel() 

     self.refreshBtn = QPushButton("Refresh") 
     self.refreshBtn.clicked.connect(self.get) 

     layout = QGridLayout() 
     layout.addWidget(self.connectionlabel, 0, 0) 
     layout.addWidget(self.refreshBtn, 0, 1) 
     layout.addWidget(self.browser, 1, 0,1,2) 

     self.setLayout(layout) 
     self.setWindowTitle("StackOverflow: Python") 


    def get(self): 
     self.browser.clear() 
     self.connectionlabel.setText("Connecting.....") 
     try: 
      response = requests.get(self.url) 
      soup = BeautifulSoup(response.content, 'lxml') 

      self.connectionlabel.setText("Connected.") 

      questions = soup.find_all("a", {"class": "question-hyperlink"}) 

      for i, questionTitle in enumerate(questions): 
       try: 
        self.browser.append("\n"+str(i+1)+". "+questionTitle.text) 
       except: 
        pass 

     except: 
      self.connectionlabel.setText("Couldn't connect.") 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    screen = Form() 
    screen.show() 
    t = Thread(screen.get) 
    t.deamon = True 
    t.start() 
    sys.exit(app.exec_()) 
+0

你必須有一個非常緩慢的互聯網連接。對我來說,'get()'方法只需要大約一秒的時間來運行。 – ekhumoro

回答

2

UI將一直凍結,直到代碼執行完成。爲了避免使用多處理或線程,並在單獨的進程/線程中調用阻塞代碼。您也可以使用PyQT的QThread

+0

你能舉個例子嗎? –

+0

https://github.com/VikasNeha/Fiverr_EmailOrderScrape_PySide/blob/master/ScrapeTool.py - 這使用PySide但它會爲PyQt的完全相同。 –

+0

我試着將它添加到另一個線程,但後來我得到這個錯誤'QObject的:不能爲父母是在不同的線程創建的兒童。 (父是QTextDocument(0x1b8b680),父線程是QThread(0x18186a0),當前線程是QThread(0x7f177037e3e0)' –