Ich versuche, einen Postfach-Checker mit imap
lib zu erstellen, es funktioniert ziemlich gut mit Python, Queue und Multithread ohne GUI.
Aber wenn ich versuche, ein GUI zu setzen, mache ich jede Funktion, die ich mache, um die GUI einzufrieren, bis ich fertig bin.
Ich habe versucht, viele Dinge aus verschiedenen doc (fügen qthread, Signal, Cursor etcc) und Tutorials keine für mich gearbeitet.
Kann jemand mir helfen zu verstehen, wie man einen Text an einen QtextEdit anlegt oder anfügt, während man eine Funktion ausführt, weil es erst nach dem Ende funktioniert.
Hier ist mein Code:
%Vor% Da es häufig Fragen zur Verwendung von QThread
in PyQt gibt, ähnlich wie bei Ihnen, hier ein Beispiel, das zeigt, wie man Threads in PyQt korrekt verwendet. Ich hoffe, dass es als Antwort für ähnliche Fragen nützlich sein kann, also verbrachte ich etwas mehr Zeit als sonst, um dies vorzubereiten.
Das Beispiel erstellt eine Anzahl von Worker-Objekten, die in Nicht-Haupt-Threads ausgeführt werden und mit dem Hauptthread (dh GUI) über die asynchronen Qt-Signale kommunizieren.
%Vor%Die wichtigsten Konzepte zum Verständnis der Multi-Thread-Programmierung in PyQt sind die folgenden:
QThread
, und seine Ereignisschleife wird von diesem Thread verwaltet. processEvents()
aufgerufen werden. Beispiel. Dies ermöglicht QThread, Ereignisse zu verarbeiten und Slots als Antwort auf asynchrone Signale von der GUI aufzurufen. Beachten Sie, dass QApplication
scheinbar QApplication.instance().processEvents()
für jeden Thread aufruft. Wenn dies nicht erwünscht ist, ist processEvents()
eine gültige Alternative. QThread.currentThread().processEvents()
beendet die Ereignisschleife nicht sofort: Sie muss auf den aktuell ausgeführten Slot (falls vorhanden) warten, um zurückzukehren. Wenn also ein Thread zum Beenden aufgefordert wird, müssen Sie darauf warten (). Um einen Worker-Thread abzubrechen, muss er normalerweise (über ein benutzerdefiniertes Signal) signalisiert werden, was auch immer er gerade tut: Dies erfordert ein benutzerdefiniertes Signal auf einem GUI-Objekt, eine Verbindung dieses Signals mit einem Worker-Slot und die Worker-Arbeitsmethode muss Thread% aufrufen. co_de%, damit das ausgesendete Signal während der Arbeit den Steckplatz erreichen kann. Ich kann nicht testen, weil settimap auf meinem System nicht verfügbar ist. Ich habe CheckerThread
in Checker
umbenannt, da es kein Thread mehr ist (es "lebt" nur in einem Thread):
Dann ersetzen Sie einfach den Inhalt der Schleife in gogogo(self)
mit diesem:
Es ist fast immer eine gute Idee, Slots mit pyqtSlot
zu dekorieren, also sollten sowohl run
als auch checkedok
so dekoriert werden.
Die SO Antwort über Qt-Threads ist ziemlich praktisch, um sich an Details zu erinnern (beachten Sie jedoch dass es Verbindungen im alten Stil verwendet - Sie müssen C ++ connect( sender, SIGNAL(sig), receiver, SLOT(slot));
in PyQt5 sender.sig.connect(receiver.slot)
übersetzen.
Sorry für die späte Antwort, aber es ist eine Technik, die ähnliche Probleme lösen kann.
Das Problem ist klar. Die GUI friert ein, weil ihr Thread einen anderen Job ausführen muss. Eine abstrahierte (vom PyQt-Punkt) Lösung ist unten angegeben:
Beispielcode:
%Vor%self.timer.timeout.connect registriert die Callback-Funktion.
Tags und Links python python-multithreading pyqt pyqt5