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 event: self.do_something(args, event)
于 2012-06-28T13:46:27.603 に答える
4

ラムダを使用:

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

ラムダ関数を使用します。これに関するいくつかのドキュメントが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()
于 2012-06-28T13:49:54.373 に答える
1

これらの引数をいつ提供するかは明確ではありませんが、 (複数の使用をサポートする を使用Bindできるように) 同時に提供する場合は、次を使用できます。do_somethingfunctools.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 に答える