2010-09-08 4 views
2

j'ai le wxPyhon code suivantévénements de liaison avec wxpython

self.button1 = wx.Button(self, id=-1, label='Button1',pos=(8, 8), size=(175, 28)) 
self.button2 = wx.Button(self, id=-1, label='Button2',pos=(16, 8), size=(175, 28)) 
self.button1.Bind(wx.EVT_BUTTON, self.onButton) 
self.button1.Bind(wx.EVT_BUTTON, self.onButton) 

et je dois traiter les boutons dans la fonction ci-dessous en fonction de l'événement luanched quelqu'un pourrait donner une idée-à-dire

def button1Click(self,event): 
    if(event of button1) : 
     #proccess code  
    if(event of button2): 
     #proccess code 

comment puis-je savoir quel bouton luanch l'événement

Répondre

3

Une option consiste à utiliser l'étiquette (ou ID ... mais qui est généralement plus difficile) à la clé hors de, tels que:

def onButton(self, event): 
    label = event.GetEventObject().GetLabel() 
    if label == "foo": 
     ... 
    elif label == "bar": 
     .... 

Souvent, je souhaite qu'il a un appel mécanisme de retour. Une autre option est d'utiliser lambda pendant la liaison. Voir ceci tutorial

+0

Bonne réponse. Cela m'a aidé, mais j'ai découvert qu'il est encore mieux d'utiliser la méthode .GetName(), car l'étiquette peut être une longue chaîne. Le nom peut être facilement défini lors de la création du bouton. – bgusach

0

Vous pouvez l'étiquette de boutons pour l'identifier comme si

def onButton(self,event): 
    buttonLabel = event.GetEventObject().GetLabel() 
    if buttonLabel == "Button1": 
     doSomething() 
    elif buttonLabel == "Button2": 
     doSomethingElse() 
1

Vous devriez avoir une fonction pour chacun d'eux s'il y a un code de traitement différent.

self.button1 = wx.Button(self, id=-1, label='Button1',pos=(8, 8), size=(175, 28)) 

self.button2 = wx.Button(self, id=-1, label='Button2',pos=(16, 8), size=(175, 28)) 

self.button1.Bind(wx.EVT_BUTTON, self.onButton1) 

self.button1.Bind(wx.EVT_BUTTON, self.onButton2) 

def onButton1(self,event): 
    # process code 

def onButton2(self,event): 
    # process code 
+1

Voir également http://wiki.wxpython.org/self.Bind%20vs.%20self.button.Bind ou http://wiki.wxpython.org/Passing%20Arguments%20to%20Callbacks –

1

Personnellement, j'aime obtenir l'objet bouton lui-même:

button = event.GetEventObject() 

Ensuite, je peux utiliser l'une des méthodes du bouton, comme GetName, GetId ou getLabel. Définir le nom est probablement le plus facile car parfois je vais avoir deux boutons avec la même étiquette.

myButton = wx.Button(self, label="blah blah", name="blah blah one") 

Maintenant, vous pouvez être assez sournois. Quelque part dans votre programme, vous pouvez avoir un dict qui mappe les noms des boutons avec les méthodes qu'ils devraient fonctionner:

self.myDict = {"btnOne":methodOne, "btnTwo":methodTwo} 

Ensuite, dans votre gestionnaire d'événements, vous pouvez avoir quelque chose comme

myButton = event.GetEventObject() 
buttonName = myButton.GetName() 
if buttonName in self.myDict: 
    self.myDict[buttonName]() 

Voir aussi http://wiki.wxpython.org/Passing%20Arguments%20to%20Callbacks ou http://wiki.wxpython.org/self.Bind%20vs.%20self.button.Bind

Questions connexes