Можно ли передавать аргументы в привязки событий?

Я не нашел ответа в другом месте, и, похоже, об этом еще не спрашивали на 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())

Но можно ли передать методу еще один аргумент? Чтобы метод мог определить, вызывают ли его более одного виджета, но при этом возвращать одно и то же значение?

Это значительно уменьшит копирование и вставку одного и того же кода, но с разными вызывающими объектами.


person crystalattice    schedule 06.10.2008    source источник


Ответы (2)


Вы всегда можете использовать лямбду или другую функцию, чтобы обернуть свой метод и передать другой аргумент, не относящийся к 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')
person Florian Bösch    schedule 06.10.2008

Лучше всего было бы создать генератор обработчиков событий, например:

def getOnClick(self, additionalArgument):
    def OnClick(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'))
person DzinX    schedule 06.10.2008
comment
я знаю, что это старая тема, но я не мог заставить ее работать как есть (может быть, что-то изменилось), мне пришлось изменить строку 2 следующим образом: def OnClick(event): - person Luca; 11.03.2018
comment
Спасибо, Лука, это была ошибка. Исправил ответ. - person DzinX; 13.03.2018