如何将其他参数传递给事件回调?

时间:2012-06-28 13:42:22

标签: python wxpython

是否可以将其他参数传递给事件回调?

例如,如果我的事件绑定看起来像这样;

self.Bind(wx.EVT_BUTTON, self.do_something, self.button) 

我怎样才能将参数传递给我的方法?

self.do_something(self,event,arguments):
    """do something with arguments"""
    pass

4 个答案:

答案 0 :(得分:7)

使用functools.partial,或一般情况下使用lambda expression

部分表格将是

functools.partial(self.do_something, args)

请注意,在这种情况下,event参数将在参数列表的末尾传递。等效的lambda形式是:

lambda event: self.do_something(args, event)

答案 1 :(得分:4)

使用lambda:

self.Bind(wx.EVT_BUTTON, lambda event, args=args: self.do_something(event, args), self.button) 

self.do_something(self,event,arguments):
    """do something with arguments"""
    pass

答案 2 :(得分:1)

目前尚不清楚何时提供这些参数,但如果您想在Bind时间提供这些参数(这样您可以拥有支持多种用途的do_something),则可以使用{ {1}}:

functools.partial

然后,当调用def do_something(self, arg, event): pass self.Bind(wx.EVT_BUTTON, functools.partial(self.do_something, arg), self.button) 时,将使用您传入do_something的{​​{1}}以及回调传递的事件来调用它。

答案 3 :(得分:1)

使用lambda函数。 wxPython wiki上有一些关于此的文档。我也在我的lambda tutorial中写过这篇文章。这是我写这篇文章时创建的蹩脚例子(也在文章中):

import wx

########################################################################
class DemoFrame(wx.Frame):
    """
    Frame that holds all other widgets
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""        
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "wx lambda tutorial",
                          size=(600,400)
                          )
        panel = wx.Panel(self)

        button8 = wx.Button(panel, label="8")
        button8.Bind(wx.EVT_BUTTON, lambda evt, name=button8.GetLabel(): self.onButton(evt, name))
        button10 = wx.Button(panel, label="10")
        button10.Bind(wx.EVT_BUTTON, lambda evt, name=button10.GetLabel(): self.onButton(evt, name))

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(button8, 0, wx.ALL, 5)
        sizer.Add(button10, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

    #----------------------------------------------------------------------
    def onButton(self, event, buttonLabel):
        """"""
        print "You pressed the %s button!" % buttonLabel

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame().Show()
    app.MainLoop()