是否可以将其他参数传递给事件回调?
例如,如果我的事件绑定看起来像这样;
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
目前尚不清楚您何时要提供这些参数,但如果您想及时提供它们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
,以及回调传递的事件调用。
使用 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()