【问题标题】:Is it possible to pass arguments into event bindings?是否可以将参数传递给事件绑定?
【发布时间】:2025-11-26 03:30:01
【问题描述】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您始终可以使用 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')
    

    【讨论】:

      最近更新 更多