6

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

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

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

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

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

4 回答 4

9

使用functools.partial,或在一般情况下使用lambda表达式

部分形式是

functools.partial(self.do_something, args)

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

lambda event: self.do_something(args, event)
于 2012-06-28T13:46:27.603 回答
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
于 2012-06-28T13:46:21.100 回答
1

目前尚不清楚您何时要提供这些参数,但如果您想及时提供它们Bind(这样您可以拥有一个do_something支持多种用途的),您可以使用functools.partial

def do_something(self, arg, event):
  pass

self.Bind(wx.EVT_BUTTON, functools.partial(self.do_something, arg), self.button)

然后当do_something被调用时,它会被arg你传入的partial,以及回调传递的事件调用。

于 2012-06-28T13:47:10.753 回答
1

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

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()
于 2012-06-28T13:49:54.373 回答