2008-10-06 8 views
25

No he encontrado una respuesta en otro lugar y esto no parece haber sido solicitado aún en SO.¿Es posible pasar argumentos a enlaces de eventos?

Al crear un enlace de evento en wxPython, ¿es posible pasar argumentos adicionales al evento? Por ejemplo, esta es la manera normal:

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()) 

Pero es posible tener otro argumento pasado al método? ¿Tal que el método puede decir si más de un widget lo está llamando pero todavía devuelve el mismo valor?

Reduciría en gran medida la copia & pegando el mismo código pero con diferentes llamadas.

Respuesta

42

Siempre puede usar una lambda u otra función para concluir su método y pasar otro argumento, no específico de 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 estás fuera para reducir la cantidad de código para escribir, también se podría tratar de un poco de automatismo como:

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

Gran respuesta. ¡Gracias! –

11

la mejor manera sería hacer un generador de controladores de eventos, por ejemplo:

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

Ahora se enlaza con:

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