如何为事件处理程序提供变量? [英] How can I give variables to the event handler?

查看:28
本文介绍了如何为事件处理程序提供变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can I give a variable to a function when I bind something? As a simple example:

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

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

如您所见,我想为函数something"赋予值AnyVariable",以便将其用作x".我怎样才能做到这一点?这个例子不起作用.

As you see, I want to give the value "AnyVariable" to the function "something" so that it will be used as the "x". How can I do this? This example doesn't work.

@保罗麦克奈特:是的,我想做的更像是:

@ Paul McNett: Yeah, what I'm trying to do is more like:

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.

x=Variable1 when "MyTextCtrl1" is edited, x=Variable2 when "MyTextCtrl2" is edited and x=Variable3 when "MyTextCtrl3" is edited.

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

Of course I also could write 3 different functions ("def something1", "def something2", "def something3") and bind them to "MyTextCtrl1", "MyTextCtrl2" or "MyTextCtrl3". But I thought it could be much easier when I use this variable instead ;)

推荐答案

应采用以下方法之一:

  • 引入一个全局变量(模块级函数作用域之外的变量声明).

  • Introduce a global variable (variable declaration outside the function scope at module level).

x = None
def test(self):
    self.MyTextCtrl.Bind(wx.EVT_TEXT, self.something)

def something(self, event):
    global x
    x = ... # alter variable on event

  • 引入一个类的成员变量.

  • Introduce a member variable of a class.

    此外wx.EVTHandler 建议任何可调用的事件处理程序.对于这种情况,我编写了一个简单的类来保存一个值(可扩展为多个值)并实现了一个 __call__ 方法.干扰特殊方法是一个高级主题,对于这种情况,我已经整理了示例代码:

    Furthermore wx.EVTHandler suggests anything as event handler that is callable. For this case I've written a simple class to hold one value (extendable for multiple values) and that implements a __call__ method. Interfering special methods is an advanced topic, for this case I've put together example code:

    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()
    

  • 这篇关于如何为事件处理程序提供变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆