是否可以向事件回调函数传递额外的参数?
例如,如果我的事件绑定如下:
self.Bind(wx.EVT_BUTTON, self.do_something, self.button)
我该如何将参数传递给我的方法?
self.do_something(self,event,arguments):
"""do something with arguments"""
pass
是否可以向事件回调函数传递额外的参数?
例如,如果我的事件绑定如下:
self.Bind(wx.EVT_BUTTON, self.do_something, self.button)
self.do_something(self,event,arguments):
"""do something with arguments"""
pass
functools.partial
或一般情况下使用 lambda
表达式。部分形式如下:functools.partial(self.do_something, args)
event
参数将会在参数列表的末尾传递。相应的lambda表达式形式如下:lambda event: self.do_something(args, event)
使用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
lambda event: self.do_something(event, args)
而不是lambda event, args=args: self.do_something(event, args)
(注意args=args
),那么代码可能会出现混乱。 - warvariuc不清楚您何时想提供这些参数,但如果您想在 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
时,它将使用您传递给partial
的arg
以及回调传递的事件一起被调用。
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()