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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/173687/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 19:36:36  来源:igfitidea点击:

Is it possible to pass arguments into event bindings?

pythoneventswxpython

提问by crystalattice

I haven't found an answer elsewhere and this doesn't appear to have been asked yet on SO.

我还没有在其他地方找到答案,而且似乎还没有在 SO 上问过这个问题。

When creating an event binding in wxPython, is it possible to pass additional arguments to the event? For example, this is the normal way:

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

But is it possible to have another argument passed to the method? Such that the method can tell if more than one widget is calling it but still return the same value?

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

It would greatly reduce copy & pasting the same code but with different callers.

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

回答by Florian B?sch

You can always use a lambda or another function to wrap up your method and pass another argument, not WX specific.

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

If you're out to reduce the amount of code to type, you might also try a little automatism like:

如果您想减少要键入的代码量,您还可以尝试一些自动化,例如:

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

回答by DzinX

The nicest way would be to make a generator of event handlers, e.g.:

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

def getOnClick(self, additionalArgument):
    def OnClick(event):
        self.log.write("Click! (%d), arg: %s\n" 
                         % (event.GetId(), additionalArgument))
    return OnClick

Now you bind it with:

现在你绑定它:

b = wx.Button(self, 10, "Default Button", (20, 20))
b.Bind(wx.EVT_BUTTON, self.getOnClick('my additional data'))