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

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,

我在一个有两个wxPython TextCtrl的面板上遇到了一些问题。我希望两个控件都绑定一个EVT_CHAR或EVT_KEY_UP处理程序,并且我希望能够知道哪个TextCtrl生成了事件。我认为event.Id会告诉我这一点,但在下面的示例代码中,它总是0。有什么想法吗?我只在OSX上测试过这个

这段代码只是在启用“完成”按钮之前检查两个TextCtrl是否都包含一些文本

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也是个好主意!