1

何かをバインドするときに関数に変数を与えるにはどうすればよいですか? 簡単な例として:

def test(self):
    self.MyTextCtrl.Bind(wx.EVT_TEXT, self.something, AnyVariable)

def something(self, event, x)
    # do something
    print x

ご覧のとおり、値「AnyVariable」を関数「something」に与えて、「x」として使用したいと考えています。これどうやってするの?この例は機能しません。

編集: @ Paul McNett: ええ、私がやろうとしていることは次のようなものです:

def test(self):
    self.MyTextCtrl1.Bind(wx.EVT_TEXT, self.something, Variable1)
    self.MyTextCtrl2.Bind(wx.EVT_TEXT, self.something, Variable2)
    self.MyTextCtrl3.Bind(wx.EVT_TEXT, self.something, Variable3)

def something(self, event, x)
    # do something by including x

「MyTextCtrl1」編集時は x=Variable1、「MyTextCtrl2」編集時は x=Variable2、「MyTextCtrl3」編集時は x=Variable3 となります。

もちろん、3 つの異なる関数 ("def something1"、"def something2"、"def something3") を記述して、それらを "MyTextCtrl1"、"MyTextCtrl2"、または "MyTextCtrl3" にバインドすることもできます。しかし、代わりにこの変数を使用すると、はるかに簡単になると思いました;)

4

1 に答える 1

1

次のいずれかのアプローチで実行できます。

  • グローバル変数(モジュールレベルでの関数スコープ外の変数宣言)を導入します。

    x = None
    def test(self):
        self.MyTextCtrl.Bind(wx.EVT_TEXT, self.something)
    
    def something(self, event):
        global x
        x = ... # alter variable on event
    
  • クラスのメンバー変数を導入します。

  • さらにwx.EVTHandler、呼び出し可能なイベントハンドラーとして何でも提案します。この場合、1つの値(複数の値に拡張可能)を保持し、メソッドを実装する単純なクラスを作成しました__call__。特別なメソッドの干渉は高度なトピックです。この場合、サンプルコードをまとめました。

    import wx
    
    class TestFrame(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, None, -1, *args, **kwargs)
            sizer = wx.BoxSizer(wx.VERTICAL)
            self.SetSizer(sizer)
            b = wx.Button(self, -1, "Test")
            sizer.Add(b)
            b.Bind(wx.EVT_BUTTON, TestHandler("foo"))
            self.Show()
    
    class TestHandler:
        def __init__(self, value):
            self.value = value
    
        def __call__(self, event):
            print event
            print "My value is:", self.value
    
    if __name__ == "__main__":
        app = wx.App()
        TestFrame("")
        app.MainLoop()
    
于 2012-09-24T19:08:00.350 に答える