Python, QT, Aufruf von Methoden

OP #2795855
Lesenswert?

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
Angehängte Dateien:
Gast #2797629
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren