Forum: PC-Programmierung Python, QT, Aufruf von Methoden


von Christian J. (stormracer)


Angehängte Dateien:

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

von Rolf Magnus (Gast)


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.

von Christian J. (stormracer)


Angehängte Dateien:

Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.