Ich versuche gerade eine PyQt5-App zu erstellen und sie sollte aus der Haupt-GUI bestehen und im Hintergrund sollte es einen anderen Thread geben, der etwas in einer Endlosschleife messen sollte. Und ich möchte diesen Thread mit einer QAction oder Checkbox starten und stoppen.Thread starten und stoppen mit QAction getoggelt
Also wenn ich die Checkbox drücke und der Status wahr ist, sollte der Thread gestartet werden und wenn ich ihn erneut anklicke, sollte er gestoppt werden.
Nun, was ist der beste Weg, dies zu implementieren?
Zeit einen Worker-Thread wie dies Ich verwende:
class Worker(QtCore.QObject):
def __init__(self):
super(Worker, self).__init__()
self._isRunning = True
def task(self):
if not self._isRunning:
self._isRunning = True
while self._isRunning:
time.sleep(0.5)
... measure ...
def stop(self):
self._isRunning = False
und diese im Hauptthread zu machen laufen:
self.thread = QtCore.QThread()
self.thread.start()
self.worker = Worker()
self.worker.moveToThread(self.thread)
self.btn_start.clicked.connect(self.worker.task)
self.btn_stopped.clicked.connect(lambda: self.worker.stop())
Bisher dies funktioniert. Aber ich bin nicht wirklich zuversichtlich, dass dies der beste Weg ist, um es zu tun, und es würde mir auch viel besser gefallen, wenn ich dasselbe mit einer Checkbox in der beschriebenen Weise machen könnte.
Vielen Dank! Gibt es einen bestimmten Grund, warum Sie in der Task-Methode anhalten? Sollte nicht aufhören, False zu sein, um an diesen Punkt zu kommen? Was würde ich auch tun müssen, damit der Worker-Thread ein Label im GUI-Thread ändert, ohne ein Chaos zu verursachen? – haxor789
@ haxor789. Sie haben recht mit 'stop()' - es war nur etwas von einer früheren Version übrig. Ich habe die Demo aktualisiert, um ein Etikett zu ändern. – ekhumoro