Datum:
Angehängte Dateien:Hallo, ich beschäftige mich gerade mit der Programmierung in Python. OOP kenn ich aus Java. In Python gefällt mir die Verbindung zu PyQt4 gut, da dadurch plattformabhängige Gui's erstellt werden können und es einfacher aussieht, als QT mit C++. Ich möchte in einem Thread Daten über die Serielle Schnittstelle empfangen und in der Gui in einem Textfeld darstellen. Die Ansprache der einzelnen Elemente funktioniert. Schwer tue ich mich gerade dabei, aus dem (Thread) Klasse auf Methoden der anderen Klasse zuzugreifen. Da habe ich noch keinen "richtigen" Weg gefunden. Mein angehängter Versuch besteht darin, eine Referenz auf die "Gui" Klasse zu übergeben, um dann auf die Methoden zugreifen zu können. Wenn ich das Programm starte bekomme ich erst diese Meldung: QObject::connect: Cannot queue arguments of type 'QTextCursor' (Make sure 'QTextCursor' is registered using qRegisterMetaType().) Anschließend stürzt das Programm nach ein paar Sekunden ab. ---- Wenn ich versuche die Methode durch den Klassennamen aufrufe (TestWindow.appendText(self, "B")), bekomme ich diese Meldung: AttributeError: 'SerialReading' object has no attribute 'textField' Da scheint also etwas mit der 'self' Variable durcheinander zu kommen. Wie mache ich es richtig, oder wonach muss ich suchen? Den QThread anstatt die Threading lib benutze ich nur, da ich gelesen habe, dass dann die Interaktion mit den Qt Elementen einfacher ist. Oder geht es bei Python ganz anders? Ich verwende Python3.2, macht das etwas aus? Viele Grüße Christian
Datum:
Christian J. schrieb: > ich beschäftige mich gerade mit der Programmierung in Python. OOP kenn > ich aus Java. In Python gefällt mir die Verbindung zu PyQt4 gut, da > dadurch plattformabhängige Gui's erstellt werden können und es einfacher > aussieht, als QT mit C++. Hmm, ich finde, daß es bis auf die etwas andere Syntax praktisch fast gleich aussieht. > Schwer tue ich mich gerade dabei, aus dem (Thread) Klasse auf Methoden > der anderen Klasse zuzugreifen. Man greift nicht darauf zu, sondern ruft sie auf. Und wenn du in einen Thread einen Aufruf schreibst, wird dieser natürlich auch im Kontext dieses Threads ausgeführt und nicht im Kontext des Threads, in dem du das Objekt erstellt hast. > Wenn ich das Programm starte bekomme ich erst diese Meldung: > QObject::connect: Cannot queue arguments of type 'QTextCursor' > (Make sure 'QTextCursor' is registered using qRegisterMetaType().) Das liegt daran, daß Qt erkennt, daß das Objekt, das das Signal erzeugt und das Objekt, dessen Slot aufgerufen werden soll, aus untesrchiedlichen Threads stammen. Deshalb wird die Verbindung nicht direkt gemacht, sondern der Aufruf wird über die Event-Queue umgeleitet, damit er im richtigen Thread-Kontext erfolgt. Dazu müssen aber alle Argumente serialisiert werden, und Qt kann offensichtlich QTextCursor defaultmäßig nicht serialisieren. Die Lösung steht aber ja schon in der Fehlermeldung mit drin. > Wenn ich versuche die Methode durch den Klassennamen aufrufe > (TestWindow.appendText(self, "B")), bekomme ich diese Meldung: > AttributeError: 'SerialReading' object has no attribute 'textField' > > Da scheint also etwas mit der 'self' Variable durcheinander zu kommen. Wieso? Die Klasse SerialReading, worauf self ja verweiset, hat doch tatsächlich kein "textField". > Den QThread anstatt die Threading lib benutze ich nur, da ich gelesen > habe, dass dann die Interaktion mit den Qt Elementen einfacher ist. Es empfielt sich, wenn du mehrere Threads nutzen willst, in denen du Qt verwendest.
Datum:
Angehängte Dateien:Hallo, danke für deine Antwort. Ich habe jetzt einen funktionierenden Weg gefunden, indem ich von dem Thread ein Signal sende, welches in der "Gui" Klasse ausgewertet wird. Viele Grüße Christian