so ganz verstehe ich das mit den Signalen leider immer noch nicht und brauche daher noch mal Hilfe.
Es ist so, dass ich gerne von meinem Main Thread aus einen Worker Thread starten möchte. und dieser WorkerThread ruft weitere Funktionen aus anderen Dateien auf. Eine Funktion die aufgerufen wird, startet z.B. ein subprocess und analysiert eine Videodatei mit ffmpeg. Jetzt hätte ich gerne von dieser Funktion aus die Möglichkeit dass sie Signale zu meinem Main Thread schicken kann, damit ich dort eine Progressbar updaten kann.
Wenn das Signal direkt aus meinem WorkerThread aus verwendet wird, geht das auch, aber wenn ich dafür eine Helferklasse einrichten möchte, die von überall aus erreichbar sein soll, funktioniert es nicht mehr.
Habe mal dieses Beispiel zusammen geschrieben:
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 Emitter(QObject):
progress = Signal(str)
def __init__(self):
QObject.__init__(self)
def send(self, text):
self.progress.emit(text)
class WorkerThread(QThread):
# progress = Signal(str)
def __init__(self, parent=None):
QThread.__init__(self, parent)
def run(self):
for i in range(1000):
# self.progress.emit(str(i))
Emitter().send(str(i))
sleep(0.2)
def stop(self):
self.terminate()
def main():
app = QApplication(sys.argv)
worker = WorkerThread()
emitter = Emitter()
def run_worker():
worker.start()
def stop_worker():
worker.stop()
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)
emitter.progress.connect(update_label)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Hier würde jetzt der Emitter direkt vom WorkerThread aus angesprochen werden, was jetzt so keinen Sinn macht, aber ich denke zum verdeutlichen sollte das genügen, weil dieses Beispiel so schon nicht mehr funktioniert.
Was kann ich denn machen, damit die Emitter Klasse funktioniert, und auch aus anderen Funktionen heraus (die vom WorkerThread ausgeführt würden) angesprochen werden kann?