能否将参数传递到事件绑定中?

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

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

这将大大减少复制并粘贴相同代码但使用不同调用程序的情况。


这个回答解决了你的问题吗?Python中如何将参数传递给函数指针参数? - user202729
2个回答

49

你可以随时使用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')

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接