2017-08-13 1 views
1

Hallo, ich habe zu meinem Thread-Worker-Link zu GUI senden und GUI-Informationen direkt von QThread aktualisieren. Wie hier:Ändern der GUI direkt von Qthread PyQt 5

class Worker(QThread): 
    def __init__(self, ui): 
    QThread.__init__(self) 
    self.running = False 
    self.ui = ui 

    def run(self): 
    self.running = True 
    while self.running: 
     info = self.check_info() 
     rows = len(info) 
     self.ui.tableWidget.setRowCount(rows) 
     self.ui.tableWidget.setColumnCount(6) 
     ... 

In Haupt QMainWindow i fügen Sie einfach

def __init__(self, parent=None): 
    ....... 
    self.myworker = Worker(self.ui) 
    ..... 

solche Lösung sehr schlecht in PyQt5 ist? Ich bin neu in PyQt. Danke. Wenn meine Lösung schlecht ist, bitte hilf mir, es zu beheben.

+1

Sie sollten die GUI in einem anderen Thread als dem Hauptthread nicht aktualisieren. Sie müssen Signale und Slots verwenden, um die Informationen von den sekundären Threads an den Hauptthread zu senden. – eyllanesc

+0

Was ist 'info'? – eyllanesc

+0

Darf ich irgendwelche Informationen über Signale senden, zum Beispiel eine Liste von Diktaten, die ich durch Ausführen des Threads erhalte? – Hellbea

Antwort

2

Sie können nicht und kann nicht die GUI von einem sekundären Thread aktualisieren, müssen Sie es durch Signale und Slots tun:

Hierfür wir ein Signal durch die Klasse erstellen, gehen pyqtSignal(), und wir werden zeigen, die Arten von Argumenten, dann verbinden wir es mit dem Schlitz, die wir wollen, wie ich weiter unten zeigen:

Thema:

class Worker(QThread): 
    list_of_dict_signals = pyqtSignal(list) 
    str_signal = pyqtSignal(str) 
    def __init__(self, parent=None): 
     QThread.__init__(self, parent) 
     self.running = False 

    def run(self): 
     self.running = True 
     while self.running: 
      info = self.check_info() 
      self.list_of_dict_signals.emit(info) 
      self.str_signal.emit("Requesting info") 

GUI:

def __init__(self, parent=None): 
    ....... 
    self.myworker = Worker(self) 
    self.myworker.list_of_dict_signals.connect(self.onDataFromThread) 
    self.myworker.str_signal.connect(self.ui.statusbar.showMessage) 
    self.myworker.start() 

def onDataFromThread(self, info): 
    rows = len(info) 
    self.ui.tableWidget.setRowCount(rows) 
    ... 
+0

Thx für die Lösung für was wir 'def onDataFromThread' verwenden? – Hellbea

+0

In dieser Funktion erhalten Sie die Liste der Wörterbücher, das heißt, jedes Mal, wenn Sie das Signal senden, das die Liste der Wörterbücher sendet, die aufgerufen werden, müssen Sie das ui.tableWidget aktualisieren. – eyllanesc

+0

Big thx für Antwort inow ich verstehe, wie Signale Steckplatz arbeiten. Ich habe – Hellbea

Verwandte Themen