是否可以将参数传递给事件绑定?

时间:2008-10-06 09:31:41

标签: python events wxpython

我还没有在其他地方找到答案,而且似乎还没有在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 个答案:

答案 0 :(得分:46)

您总是可以使用lambda或其他函数来包装您的方法并传递另一个参数,而不是特定于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')

答案 1 :(得分:13)

最好的方法是创建事件处理程序的生成器,例如:

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