Unter Verwendung der gleichen Prozedur für mehrere wx.TextCtrls?
Frage
Ich habe ein paar Probleme mit einer Platte, die zwei WxPython TextCtrls in ihm hat. Ich möchte entweder ein EVT_CHAR oder EVT_KEY_UP Handler für beide Steuerelemente gebunden, und ich möchte in der Lage zu sagen, welche TextCtrl das Ereignis generiert hat. Ich würde denken, dass event.Id mir das sagen würde, aber in der folgenden Beispielcode, es ist immer 0. Irgendwelche Gedanken? Ich habe nur getestet dies auf O X.
Dieser Code prüft einfach, dass beiden TextCtrls in ihnen einen Text haben, bevor die Schaltfläche Fertig ermöglicht
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()
Lösung
Sie könnten versuchen event.GetId()
oder event.GetEventObject()
und sehen, ob einer von ihnen arbeiten.
Ein weiterer Ansatz dazu ist Lambda oder functools.partial zu verwenden, um effektiv einen Parameter an die Prozedur übergeben. So zum Beispiel Unter in den folgenden Zeilen in Ihr Programm:
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
Und dann wird ob entweder entry
oder entry2
je nachdem, welche Panel geklickt wird. Aber natürlich sollte dies nicht notwendig sein, und GetId und GetEventObject () sollten beide arbeiten -. Obwohl ich (noch) nicht haben ein Mac diese anprobieren