wx-Event in einer nicht von wx-erbenden Klasse auslösen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Blauer Fasan
User
Beiträge: 49
Registriert: Montag 26. März 2007, 15:08
Kontaktdaten:

Donnerstag 26. Februar 2009, 23:53

Guten Tag!

Ich möchte innerhalb eines Threads (nicht von wx erbende Klasse), der bei einem Server, implementiert durch socket, auf eingehende Verbindung wartet, eben beim Eintreten dieses Falles ein Event auslösen, welches in der Benutzeroberfläche (eine von wx erbende Klasse) abgehandelt wird.

Also das Event soll vom Thread ausgelöst und an eine Methode in der Benutzeroberfläche gebunden werden.

Als Lösung habe ich hier im Forum bereits dieses hier gefunden:

http://www.python-forum.de/topic-6165.h ... ausl%F6sen

Ich meine die Antwort Gerolds. Dort wird so...

Code: Alles auswählen

event = BeimKlickenEvent(myEVT_BEIM_KLICKEN, self.GetId())
event.mein_parameter = 10
self.GetEventHandler().ProcessEvent(event)
das Event initialisiert und ausgelöst. Da dieses allerdings mit der Funktion self.GetId() sowie der Funktion self.GetEventHandler() zusammenhängt, ist das Auslösen in meinem Falle nicht möglich, da die hier verwendete Klasse (der Thread) nicht von wx erbt und somit beide Funktionen nicht beherrscht.

Mich würde es wirklich sehr freuen, wenn ihr mir helfen könntet.

Danke für alle Bemühungen

Blauer
Dummheit heißt sich in den Vordergrund zu stellen, um gesehen zu werden.
Klugheit heißt sich zurückzuhalten, um zu sehen!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 27. Februar 2009, 09:46

Blauer Fasan hat geschrieben:Als Lösung habe ich hier im Forum bereits dieses hier gefunden:
http://www.python-forum.de/topic-6165.h ... ausl%F6sen
Hallo Blauer Fasan!

Das mit dem Erstellen von wx-Events funktioniert inzwischen mit ``wx.lib.newevent`` etwas einfacher.

Für dein Problem würde ich aber nicht mit einem wx-Event arbeiten. Besser gefallen würde mir die Übergabe einer Funktion oder Methode, die vom arbeitenden Thread aufgerufen wird, wenn sich etwas tut. Sozusagen, eine "Callback-Funktion".

Du musst dich nur darum kümmern, dass der arbeitende Thread **nicht** direkt Anweisungen an den GUI-Thread schickt. Das funktioniert mit ``wx.CallAfter()``.

- http://www.python-forum.de/topic-14626.html
- http://www.python-forum.de/topic-14624.html
- http://www.python-forum.de/topic-12193.html
- http://www.python-forum.de/topic-10704.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Blauer Fasan
User
Beiträge: 49
Registriert: Montag 26. März 2007, 15:08
Kontaktdaten:

Freitag 27. Februar 2009, 16:45

Also ersteinmal danke für die schnelle Antwort!

Ich berufe mich im Folgendem auf diesen Lösungsvorschlag:

http://www.python-forum.de/topic-10704.html

Dort sind die Thread- sowie GUI-Applikation bzw. die Applikation, welche das Event abfängt alle in einer Datei. Dies ist ja normal nicht der Fall, genauso wie bei mir.

Nun wird bei mir mit deiner Lösung die an das Event gebundene Methode nicht aufgerufen und so dachte ich mir, dass dies eben an der Aufteilung der Klassen in mehrere Dateien liegt. So habe ich dann dein Beispiel genommen und dort auch Thread- von den anderen beiden getrennt.
Und siehe da, es funktioniert auch nicht.

Hat das vielleicht etwas mit der Erstellung der Event-Klasse und Eventbinder-Funktionen zu tun?

Code: Alles auswählen

# Event-Klasse und Eventbinder-Funktionen erstellen
(NewStatusEvent, EVT_NEW_STATUS) = wx.lib.newevent.NewEvent()
Denn dieses Erzeugen wird ja nun in beiden Dateien vollzogen und somit unterscheiden sich doch dann die Instanzen der Event-Klasse und der Eventbinder-Funktion, richtig?

Ist dies das Problem? Und wenn ja, was sollte man dagegen tun?

Schonmal wieder vielen Dank für das Auseinandersetzen mit meinem Problem! :)
Dummheit heißt sich in den Vordergrund zu stellen, um gesehen zu werden.
Klugheit heißt sich zurückzuhalten, um zu sehen!
Benutzeravatar
Blauer Fasan
User
Beiträge: 49
Registriert: Montag 26. März 2007, 15:08
Kontaktdaten:

Freitag 27. Februar 2009, 19:48

Also wenn jemand außer gerold noch eine Idee hat, kann er diese bitte gerne äußern, denn wir (ich und mein Programmierpartner hier^^) haben bis morgen noch Zeit, unser Projekt fertigzustellen.

Also mal ganz freundlich *drängel* :P

Danke :)
Dummheit heißt sich in den Vordergrund zu stellen, um gesehen zu werden.
Klugheit heißt sich zurückzuhalten, um zu sehen!
Antworten