nachdem mir bei meinem letzten Post schon so fachmännisch geholfen wurde, versuche ich es nochmal.
Bitte entschuldigt diesen komischen Betreff, wusste nicht, wie ich es sonst am besten beschreiben kann.
Meine Ausgangssituation ist Folgende:
Ich habe einen WorkerThread, welcher im Hintergrund zyklisch über einen QTimer eine Aufgabe erfüllt. Ist diese beendet, wird ein Signal emittiert.
In meinem MainWindow "connecte" ich zu diesem Signal. Das funktioniert wunderbar.
Hier mal der Code, auf das Wesentliche reduziert.
Code: Alles auswählen
import sys
from PyQt4 import QtCore,QtGui
class WorkerThread(QtCore.QThread):
def __init__(self):
super(WorkerThread,self).__init__()
def run(self):
self.emit(QtCore.SIGNAL("aus_dem_worker"))
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.testthread = WorkerThread()
self.connect(self.testthread, QtCore.SIGNAL("aus_dem_worker"), self.schreibe)
self.testthread.start()
def schreibe(self):
print "Hallo Welt, gestartet von dem testthread"
def main(argv):
app = QtGui.QApplication(argv)
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main(sys.argv)
In meinem MainWindow soll beispielsweise ein Knopf gedrückt werden, woraufhin eine Funktion in dem WorkerThread aufgerufen wird. Analog zum vorherigen Beispiel will ich den threadsicheren Signal/Slot-Mechanismus verwenden. Mein ursprünglicher Ansatz war entsprechend Folgender:
Code: Alles auswählen
import sys
from PyQt4 import QtCore,QtGui
class WorkerThread(QtCore.QThread):
def __init__(self):
super(WorkerThread,self).__init__()
self.connect(????????,QtCore.SIGNAL("aus_dem_mainwindow"),self.schreibe)
def run(self):
# Hier steht im urspruenglichen Code die zyklische Berechnung von Werten drin
return
def schreibe(self):
print "Hallo Welt, gestartet durch MainWindow"
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.testthread = WorkerThread()
self.testthread.start()
button = QtGui.QPushButton("Starte Funktion 'schreibe' aus WorkerThread")
button.clicked.connect(self.starte_funktion_aus_workerthread)
self.setCentralWidget(button)
def starte_funktion_aus_workerthread(self):
self.emit(QtCore.SIGNAL("aus_dem_mainwindow"))
def main(argv):
app = QtGui.QApplication(argv)
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main(sys.argv)
Leider komme ich hier nicht weiter (siehe "??????" in Zeile 7). Im Internet habe ich einige Forenbeiträge gefunden, die mich vermuten lasse, dass ich etwas Wesentliches (Grundlegend Programmierung, nicht PyQt-spezifisch) nicht verstanden habe.
Wie gehe ich dieses Problem am besten an? Der erste Parameter der connect-Funktion muss anscheinend vom Typ QObject sein, falls das weiterhilft. Ich glaube, jemand hat ein ähnliches Problem gelöst, indem er einen eigenen "Emitter", welcher von QObject erbt, erstellt hat.
Oder ist etwas grundlegend falsch mit der Logik, die ich hier versuche umzusetzen? (also ja eigentliches Problem: Funktionen aus einem laufenden Thread abrufen)
Vielleicht ein paar wichtige Hintergrundinformationen: Leider muss sowohl das zyklische "Lesen" als auch das "Schreiben" im selben Thread erfolgen, da hier über die serielle Schnittstelle eine Verbindung zum Mikrocontroller aufgebaut wird.
Bin über jede Hilfe dankbar!