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

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

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

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

Ответы [ 2 ]

46 голосов
/ 06 октября 2008

Вы всегда можете использовать лямбду или другую функцию, чтобы завершить ваш метод и передать другой аргумент, не зависящий от 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')
13 голосов
/ 06 октября 2008

Самый хороший способ - создать генератор обработчиков событий, например ::100100

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...