Можно ли передавать аргументы в привязки событий?
Я не нашел ответа в другом месте, и это, похоже, еще не спрошено на SO.
При создании привязки события в wxPython можно передать дополнительные аргументы в событие? Например, это обычный способ:
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())
Но можно ли передать другой аргумент другому методу? Чтобы метод мог определить, вызывает ли его более одного виджета, но все же возвращает одно и то же значение?
Это значительно сократило бы копирование и вставку одного и того же кода, но с разными абонентами.
Ответы
Ответ 1
Вы всегда можете использовать лямбда или другую функцию, чтобы завершить свой метод и передать другой аргумент, а не 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())
Если вы хотите уменьшить количество вводимых кодов, вы также можете попробовать немного автоматизировать, например:
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')
Ответ 2
Самый приятный способ - создать генератор обработчиков событий, например:
def getOnClick(self, additionalArgument):
def OnClick(self, event):
self.log.write("Click! (%d), arg: %s\n"
% (event.GetId(), additionalArgument))
return OnClick
Теперь вы связываете его с:
b = wx.Button(self, 10, "Default Button", (20, 20))
b.Bind(wx.EVT_BUTTON, self.getOnClick('my additional data'))