Re: Signals von überall aus erreichbar machen
Verfasst: Freitag 26. April 2019, 15:32
Ah, das ist wirklich cool! Und so wie ich das sehe, wird dann "send()" auch im gleichen Thread ausgeführt wie der Worker und damit queued?!
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from time import sleep
from PySide2.QtCore import QObject, Signal, QThread
from PySide2.QtWidgets import (QApplication, QWidget, QLabel,
QPushButton, QVBoxLayout)
class Worker(QObject):
progress = Signal(str)
def __init__(self):
QObject.__init__(self)
self._pause = False
self.is_running = True
self.count = 0
def work(self):
while self.is_running:
if not self._pause:
self.progress.emit(str(self.count))
self.count += 1
sleep(0.2)
def pause(self):
self._pause = True
def start(self):
self._pause = False
def quit(self):
self.is_running = False
def main():
app = QApplication(sys.argv)
worker_thread = QThread()
worker = Worker()
worker_thread.started.connect(worker.work)
worker.moveToThread(worker_thread)
def run_worker():
if button.text() == 'Start':
worker.start()
if not worker_thread.isRunning():
worker_thread.start()
button.setText("Stop")
else:
button.setText("Start")
worker.pause()
def stop_worker():
worker.quit()
worker_thread.quit()
worker_thread.wait()
app.aboutToQuit.connect(stop_worker)
w = QWidget()
w.setWindowTitle('Signal Sender')
layout = QVBoxLayout(w)
label = QLabel(w)
button = QPushButton(w)
button.setText("Start")
button.clicked.connect(run_worker)
layout.addWidget(label)
layout.addWidget(button)
def update_label(text):
label.setText(text)
worker.progress.connect(update_label)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()