python - parametros - ¿Es posible pasar argumentos a enlaces de eventos?
que es argv en python (2)
La mejor manera sería crear un generador de controladores de eventos, por ejemplo:
def getOnClick(self, additionalArgument):
def OnClick(event):
self.log.write("Click! (%d), arg: %s/n"
% (event.GetId(), additionalArgument))
return OnClick
Ahora lo vinculas con:
b = wx.Button(self, 10, "Default Button", (20, 20))
b.Bind(wx.EVT_BUTTON, self.getOnClick(''my additional data''))
No he encontrado una respuesta en otro lugar y parece que esto aún no se ha solicitado en SO.
Al crear un enlace de evento en wxPython, ¿es posible pasar argumentos adicionales al evento? Por ejemplo, esta es la forma 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 enormemente la copia y el pegado del mismo código pero con diferentes llamadas.
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 quieres reducir la cantidad de código para escribir, también puedes probar un pequeño 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'')