是否可以将其他参数传递给事件回调?
例如,如果我的事件绑定看起来像这样;
self.Bind(wx.EVT_BUTTON, self.do_something, self.button)
我怎样才能将参数传递给我的方法?
self.do_something(self,event,arguments):
"""do something with arguments"""
pass
答案 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()