2008-10-06 6 views
25

Je n'ai pas trouvé de réponse ailleurs et cela ne semble pas encore avoir été demandé sur SO.Est-il possible de passer des arguments dans des liaisons d'événements?

Lors de la création d'une liaison d'événement dans wxPython, est-il possible de transmettre des arguments supplémentaires à l'événement? Par exemple, c'est la manière normale:

b = wx.Button(self, 10, "Default Button", (20, 20)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick, b) 
def OnClick(self, event): 
     self.log.write("Click! (%d)\n" % event.GetId()) 

Mais est-il possible d'avoir un autre argument passé à la méthode? Tellement que la méthode peut dire si plus d'un widget l'appelle mais retourne toujours la même valeur?

Il réduirait considérablement la copie & en collant le même code mais avec des appelants différents.

Répondre

42

Vous pouvez toujours utiliser une fonction lambda ou une autre pour compléter votre méthode et passer un autre argument, pas spécifique à WX.

b = wx.Button(self, 10, "Default Button", (20, 20)) 
     self.Bind(wx.EVT_BUTTON, lambda event: self.OnClick(event, 'somevalue'), b) 
def OnClick(self, event, somearg): 
     self.log.write("Click! (%d)\n" % event.GetId()) 

Si vous êtes hors de réduire la quantité de code à taper, vous pouvez également essayer un peu d'automatisme comme:

class foo(whateverwxobject): 
    def better_bind(self, type, instance, handler, *args, **kwargs): 
     self.Bind(type, lambda event: handler(event, *args, **kwargs), instance) 

    def __init__(self): 
     self.better_bind(wx.EVT_BUTTON, b, self.OnClick, 'somevalue') 
+0

Bonne réponse. Merci! –

11

La plus belle façon serait de faire un générateur de gestionnaires d'événements, par exemple:

def getOnClick(self, additionalArgument): 
    def OnClick(self, event): 
     self.log.write("Click! (%d), arg: %s\n" 
         % (event.GetId(), additionalArgument)) 
    return OnClick 

maintenant vous liez avec:

b = wx.Button(self, 10, "Default Button", (20, 20)) 
b.Bind(wx.EVT_BUTTON, self.getOnClick('my additional data')) 
Questions connexes