Is it possible to pass arguments into event bindings?

前端 未结 2 1642
忘掉有多难
忘掉有多难 2020-12-02 09:49

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

When creating an event binding in wxPython, is it possible to pass additi

相关标签:
2条回答
  • 2020-12-02 10:02

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

    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')
    
    0 讨论(0)
  • 2020-12-02 10:13

    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'))
    
    0 讨论(0)
提交回复
热议问题