如何将变量赋给事件处理程序?

时间:2012-09-24 18:37:14

标签: wxpython

当我绑定一些东西时,如何给函数赋一个变量?举个简单的例子:

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

x =编辑“MyTextCtrl1”时的Variable1,编辑“MyTextCtrl2”时x = Variable2,编辑“MyTextCtrl3”时x = Variable3。

当然我也可以编写3个不同的函数(“def something1”,“def something2”,“def something3”)并将它们绑定到“MyTextCtrl1”,“MyTextCtrl2”或“MyTextCtrl3”。但我认为当我使用这个变量时可能会容易得多;)

1 个答案:

答案 0 :(得分: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建议任何可调用的事件处理程序。对于这种情况,我编写了一个简单的类来保存一个值(可扩展为多个值)并实现__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()