如何为事件处理程序提供变量? [英] How can I give variables to the event handler?
问题描述
当我绑定某些东西时如何给函数一个变量?举个简单的例子:
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屋!