イベント コールバックに追加の引数を渡すことは可能ですか?
たとえば、イベント バインディングが次のようになっているとします。
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 event: self.do_something(args, event)
ラムダを使用:
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
ラムダ関数を使用します。これに関するいくつかのドキュメントがwxPythonwikiにあります。ラムダチュートリアルでもそれについて書きました。これは私がそれを書いたときに私が作成した不完全な例です(これも記事にあります):
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()
これらの引数をいつ提供するかは明確ではありませんが、 (複数の使用をサポートする を使用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
れた と、コールバックによって渡されたイベントで呼び出されます。