ursprung eines Command event (menu/ menuitem/ label)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
soma
User
Beiträge: 7
Registriert: Montag 23. Januar 2006, 08:42

Montag 13. Februar 2006, 09:38

Ok, wie fange ich an?
ich habe ein kleines programm bestehend aus einem wx.Menu.
Die einzelnen Buttons generiere ich aus einem Dictionary,soll heißen
ein Schleife liest die keys aus und erstellt aus jedem key einen Button
mit Label =key
(menu.Append(a,key))
a ist eine fortlaufende nummer, sprich dann die id des eventhandlers.
Das ganze sieht dann so aus:
for key in keys:
self.Bind(wx.EVT_MENU,self.OpenX,id=a)
menu.Append(a,key)
a+=1
das ganze funktioniert auch soweit ganz gut.
nun möchte ich aber, dass die Funktion OpenX sozusagen beim aufruf
über den eventhandler weiß, wer sie denn aufgerufen hat.
die id ist ja leicht zu ermitteln, jedoch möchte ich aus openX
über den eventhandler zu dem label des buttons kommen.
Falls das überhaupt möglich ist.
wer kann mir HELFEN!????
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Montag 13. Februar 2006, 10:35

in den wx beispielen ist sowas drin.

im prinzip musst du nur zu jedem butten eine aktion anlegen die das beinhaltet - bzw eine eigene event klasse erstellen die das überträgt.

ob man jetzt direkt auch von der id zum label kommt weiss ich nicht genau, schon in die wx referenz geschaut ?

Z.B:

Code: Alles auswählen

class ResultEvent(wx.PyEvent):
    self.__init__(self, buttonname):
        wx.PyEvent.__init__(self)
        self.buttonname = buttonname
soma
User
Beiträge: 7
Registriert: Montag 23. Januar 2006, 08:42

Montag 13. Februar 2006, 10:47

mmhh ich sehe jedoch das Problem darin, dass mein dic mit den labels (button)nicht statisch ist und ich somit mal mehr und mal weniger buttons habe.daher geht deine idee ,so glaube ich, nicht auf (wenn doch. erklär mir das ganze bitte mal ein bissel genauer/ich bin ein NEULING)

ja und die wxreferenz benutze ich als kopfkissen aber werde trotzdem nicht schlau drauss..

Wer kann helfen??
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Montag 13. Februar 2006, 11:22

Ok, ich versuchs, also du definierst deine Event Klasse wie oben, dann setzt du die action für den Button das er einen wxPostEvent mit deiner custom Event klasse ausführt.

Die widgets haben auf alle Fälle eine Methode um ihren namen zurückzugeben (glaube das hiess GetLabel, bin mir aber gerade nicht mehr sicher ).


Damit das geht musst du allerdings die On"Event" Methoden generieren lassen, in dem moment wo du dann diesen button klickst, lösst es einen
eventaus, der die gebundene Methode ausführt.

Code: Alles auswählen

# In den wx init_ctrls :
self.MyButton.Bind(wx.EVT_BUTTON, self.OnMyButtonButton,
              id=wxID_BUTTONID)

# die gebundene Methode On MyButtonButton
def OnMyButtonButton(self, event):
    wx.PostEvent(self.Parent, ResultEvent(self.button.GetLabel()))

Also der Ablauf wäre dann : Button erzeugen aus einer liste oder dict, button standard click event an eine methode binden, die Methode einen neuen Event generieren lassen und diesen den ButtonLabel (oder was immer du willst) mitgeben.

Ob Evtl lässt sich das auch eleganter lösen ... fällt mir aber gerad nichts ein. So müsstest du halt durch eine schleife erst die Eventmethoden für jeden Button generieren, aber da du den event sowieso binden musst sollte das nicht allzuschwer sein.

Hoffe das war halbwegs verständlich geschrieben. :?:
Antworten