33

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

但是是否可以将另一个参数传递给该方法?这样该方法可以判断是否有多个小部件正在调用它但仍返回相同的值?

它将大大减少复制和粘贴相同代码但调用者不同的情况。

4

2 回答 2

48

您始终可以使用 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')
于 2008-10-06T09:38:08.597 回答
14

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

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'))
于 2008-10-06T10:33:33.383 回答