为多个wx.TextCtrls使用相同的处理程序?

时间:2009-10-27 00:07:18

标签: python wxpython

我遇到一个有两个wxPython TextCtrls的面板有点麻烦。我想要一个绑定到两个控件的EVT_CHAR或EVT_KEY_UP处理程序,我希望能够告诉哪个TextCtrl生成了该事件。我会认为这个事件。我会告诉我这个,但是在下面的示例代码中它始终为0.任何想法?我只在OS X上测试了这个。

在启用完成按钮

之前,此代码只检查两个TextCtrls中是否包含一些文本
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()

1 个答案:

答案 0 :(得分:4)

您可以尝试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将是entryentry2,具体取决于点击的面板。但是,当然,这不应该是必要的,并且GetId和GetEventObject()应该都可以工作 - 尽管我还没有(还)有Mac来试试这些。