2016-04-17 3 views
1

Ich versuche etwas zu machen analysiert eine Website und zeigt ihren Inhalt auf PyQt Widget.PyQt5 - Used QThread, um zu vermeiden, hängen, aber es passiert immer noch

Ich habe Logikteil abgeschlossen, aber IO-Task hängt die UI für ein paar Sekunden, macht progressbar nutzlos.

Also habe ich versucht, Threads zu verwenden, aber es hat nicht geholfen.

Hier vereinfacht Version von dem, was ich tue

Mainwindow ist Qt Designer erzeugt Klasse (I PyQt5 auf Python 3.4.4, Microsoft Windows 10 bin mit).

from PyQt5 import QtWidgets 
from PyQt5.QtCore import QThread, pyqtSignal 

class WorkerThread(QThread): 
    signal = pyqtSignal(str) 

    def __init__(self, data): 
     QThread.__init__(self) 

     self.data = data 

    def __del__(self): 
     self.wait() 

    def run(self): 
     result = dosomeIOjob(self.data) # IO and parsing job, takes about 3 seconds 
     sendsomething(result) 

    def sendsomething(self, value): 
     self.signal.emit(value) 

class UIClass(QtWidgets.QMainWindow, MainWindow.Ui_MainWindow): 
    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) 

     self.button.clicked.connect(self.dosomejob) 

    def dosomejob(self): 
     data = self.lineedit_search.text() 
     self.runworker(self, data) 

    def settext(value): 
     self.text.setText(value) 

    def runworker(self, data): 
     worker = WorkerThread(data) 
     worker.signal.connect(self.settext) 
     worker.run() 

Es gibt keine Fehler; es bleibt einfach hängen, bis der Job erledigt ist.

Bin ich pyqtSignal falsch? Entschuldigung für mein schlechtes Englisch.

Antwort

0

Sie müssen den Typ (str) übergeben, so dass settext es erhalten und in der Lage sein wird, es zu verwenden. Ich habe auch immer start() wie in worker.start() statt run() verwendet, um den Thread zu starten. Nicht sicher, dass das einen Unterschied macht, wie ich es gelesen/gelernt habe.

Hier ist der Code, den Sie ändern müssen. worker.signal[str].connect(self.settext)