Event Handling

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Hallo,

kurze Frage:
wie kann ich selbst Events definieren?
Man nehme an man hat 2 Klassen. Ich möchte gern in Klasse 1 Events definieren und in der 2. Klasse die Events aufrufen. Also in der 2. Klasse so etwas wie:

Code: Alles auswählen

wxEvtHandler.ProcessEvent(EVT_TEXT_OUT)
, möglichst sollen dabei auch mindestens eine Variable übergeben werden können.
Das ganze soll funktionieren ohne dass in der 2. Klasse die 1. initialisert wird. Also nicht so etwas in der Art wie:

Code: Alles auswählen

evt = Klasse1(EVT_TEXT_OUT, variable)
Das Event soll quasi Klassenübergreifend funktionieren. Wie kann ich ein Event mit dem Namen EVT_TEXT_OUT definieren?

Letztendlich geht es nur darum, dass ich von einer Klasse in eine andere Daten transportieren möchte und zwar ohne die 1. in die 2. einzubinden.

Einer ne Idee?
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Buell hat geschrieben:Hallo,

kurze Frage:
wie kann ich selbst Events definieren?
Man nehme an man hat 2 Klassen. Ich möchte gern in Klasse 1 Events definieren und in der 2. Klasse die Events aufrufen. Also in der 2. Klasse so etwas wie:

Code: Alles auswählen

wxEvtHandler.ProcessEvent(EVT_TEXT_OUT)
, möglichst sollen dabei auch mindestens eine Variable übergeben werden können.
Das ganze soll funktionieren ohne dass in der 2. Klasse die 1. initialisert wird. Also nicht so etwas in der Art wie:

Code: Alles auswählen

evt = Klasse1(EVT_TEXT_OUT, variable)
Das Event soll quasi Klassenübergreifend funktionieren. Wie kann ich ein Event mit dem Namen EVT_TEXT_OUT definieren?

Letztendlich geht es nur darum, dass ich von einer Klasse in eine andere Daten transportieren möchte und zwar ohne die 1. in die 2. einzubinden.

Einer ne Idee?
Leider weiss ich es auch nicht :wink: , aber in:

http://wiki.wxpython.org/index.cgi/RecipesEvents
sind einige "Rezepte" enthalten, vielleicht können sie Dir weiterhelfen. :roll:
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Danke für die Antwort, aber die Seite kannte ich schon und die hilft mir nicht wirklich viel weiter.

Also nochmal Problembeschreibung und hoffentlich kann mir jemand helfen:

Also ich habe 3 Dateien (Module) nennen wir sie data.py, hauptmodul.py und child.py
In hauptmodul.py wird ein MDI Window erzeugt (also eines in dem weitere Fenster gestartet werden können). child.py soll ein Modul sein, welches als Fenster in hauptmodul.py gestartet wird.

Folgende Situation:
Aus data.py wird ein string an hauptmodul.py gesendet. Dazu wird von data.py aus die Methode OnRecognition() in der Klasse Recognition von hauptmodul.py aufgerufen. Dieser String soll jedoch weiter gegeben werden an child.py. Nun könnte man natürlich child.py als aktives Child-Window ermitteln und in ihm eine Methode aufrufen und so den Wert übergeben. Das möchte ich jedoch nicht.
Ich habe mir gedacht, dass man doch sicher selbst ein Event erstellen kann (in hauptmodul.py) welches beim Modulaufruf von GetText() ausgelöst wird.

In child.py sollen dann mit GetEventHandler oder so alle Events von hauptmodul.py implementiert werden. Sollte doch eigentlich gehen oder?

Also an einer COM Schnittstelle geht das ohne Probleme mit win32com.client.getevents(...)

Was ich bis jetzt habe:

Code: Alles auswählen

...
#Event definieren
myEVT_SR_RECOGNITION = wx.NewEventType()
EVT_SR_RECOGNITION = wx.PyEventBinder(myEVT_SR_RECOGNITION, 1)
...
class Fenster(wx.MDIParentFrame):
       #hier wird das Fenster erzeugt
...
class Recognition:
    def __init__(self):
        print "init COM_SR_REC"
        ....
        
    def OnRecognition(self,text):
        #Event initialisieren
        start_event = SR_Recognition(0) 
        #Event setzen
        do_event =   self.GetEventHandler().ProcessEvent(start_event)
...
class SR_Recognition(wxPyCommandEvent):
    def __init__(self, eventType=EVT_SR_RECOGNITION, id=0):
        wxPyCommandEvent.__init__(self, eventType, id)

    def Clone( self ): 
        self.__class__( self.GetId() )
also bis zum do_event scheint alles zu funktionieren, Probleme hab ich nun an den EventHandler ran zu kommen.

Wär super wenn jemand ne Idee hat
Antworten