Python 对多个wx.TextCtrls使用相同的处理程序?
我在一个有两个wxPython TextCtrl的面板上遇到了一些问题。我希望两个控件都绑定一个EVT_CHAR或EVT_KEY_UP处理程序,并且我希望能够知道哪个TextCtrl生成了事件。我认为event.Id会告诉我这一点,但在下面的示例代码中,它总是0。有什么想法吗?我只在OSX上测试过这个 这段代码只是在启用“完成”按钮之前检查两个TextCtrl是否都包含一些文本Python 对多个wx.TextCtrls使用相同的处理程序?,python,wxpython,Python,Wxpython,我在一个有两个wxPython TextCtrl的面板上遇到了一些问题。我希望两个控件都绑定一个EVT_CHAR或EVT_KEY_UP处理程序,并且我希望能够知道哪个TextCtrl生成了事件。我认为event.Id会告诉我这一点,但在下面的示例代码中,它总是0。有什么想法吗?我只在OSX上测试过这个 这段代码只是在启用“完成”按钮之前检查两个TextCtrl是否都包含一些文本 import wx class MyFrame(wx.Frame): def __init__(self,
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, ID, title):
wx.Frame.__init__(self, parent, ID, title,
wx.DefaultPosition, wx.Size(200, 150))
self.panel = BaseNameEntryPanel(self)
class BaseNameEntryPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.entry = wx.TextCtrl(self, wx.NewId())
self.entry2 = wx.TextCtrl(self, wx.NewId())
self.donebtn = wx.Button(self, wx.NewId(), "Done")
self.donebtn.Disable()
vsizer = wx.BoxSizer(wx.VERTICAL)
vsizer.Add(self.entry, 1, wx.EXPAND|wx.GROW)
vsizer.Add(self.entry2, 1, wx.EXPAND|wx.GROW)
vsizer.Add(self.donebtn, 1, wx.EXPAND|wx.GROW)
self.SetSizer(vsizer)
self.Fit()
self.entry.Bind(wx.EVT_KEY_UP, self.Handle)
self.entry2.Bind(wx.EVT_KEY_UP, self.Handle)
def Handle(self, event):
keycode = event.GetKeyCode()
print keycode, event.Id # <- event.Id is always 0!
def checker(entry):
return bool(entry.GetValue().strip())
self.donebtn.Enable(checker(self.entry) and checker(self.entry2))
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, "Hello from wxPython")
frame.Show(True)
self.SetTopWindow(frame)
return True
app = MyApp(0)
app.MainLoop()
导入wx
类MyFrame(wx.Frame):
定义初始化(自我、父项、ID、标题):
wx.Frame.\uuuuu init\uuuuuuuuux(自我、父、ID、标题、,
wx.DefaultPosition,wx.Size(200,150))
self.panel=BaseNameEntryPanel(self)
类BaseNameEntryPanel(wx.Panel):
定义初始化(自身,父级):
wx.Panel.\uuuuu init\uuuuuuuuux(自,父,-1)
self.entry=wx.TextCtrl(self,wx.NewId())
self.entry2=wx.TextCtrl(self,wx.NewId())
self.donebtn=wx.Button(self,wx.NewId(),“完成”)
self.donebtn.Disable()
vsizer=wx.BoxSizer(wx.VERTICAL)
添加(self.entry,1,wx.EXPAND | wx.GROW)
添加(self.entry2,1,wx.EXPAND | wx.GROW)
添加(self.donebtn,1,wx.EXPAND | wx.GROW)
自我设置器(vsizer)
self.Fit()
self.entry.Bind(wx.EVT\u KEY\u UP,self.Handle)
self.entry2.Bind(wx.EVT\u KEY\u UP,self.Handle)
def句柄(自身、事件):
keycode=event.GetKeyCode()
打印keycode,event.Id#您可以尝试event.GetId()
或event.GetEventObject()
,看看这两种方法是否有效
另一种方法是使用lambda或functools.partial将参数有效地传递给处理程序。因此,例如,将下面几行中的子项添加到您的程序中:
self.entry.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry))
self.entry2.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry2))
def Handle(self, event, ob=None):
print ob
然后ob将是条目
或条目2
,具体取决于单击的面板。但是,当然,这是不必要的,GetId和GetEventObject()应该都能工作——尽管我(还)没有Mac电脑可以试一下。你可以试试event.GetId()
或event.GetEventObject()
看看这两种方法是否都能工作
另一种方法是使用lambda或functools.partial将参数有效地传递给处理程序。因此,例如,将下面几行中的子项添加到您的程序中:
self.entry.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry))
self.entry2.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry2))
def Handle(self, event, ob=None):
print ob
然后ob将是条目
或条目2
,具体取决于单击的面板。但是,当然,这是不必要的,GetId和GetEventObject()应该都可以工作——尽管我(还)没有Mac电脑可以试穿它们。event.GetEventObject().GetId()工作得很好,谢谢。使用functools.partial也是个好主意!event.GetEventObject().GetId()工作得很好,谢谢。使用functools.partial也是个好主意!