¿Usa el mismo controlador para múltiples wx.TextCtrls?
Pregunta
Tengo algunos problemas con un panel que tiene dos wxPython TextCtrls. Quiero un controlador EVT_CHAR o EVT_KEY_UP vinculado a ambos controles, y quiero saber qué TextCtrl generó el evento. Creo que ese evento. Me lo diría, pero en el siguiente código de muestra siempre es 0. ¿Alguna idea? Solo he probado esto en OS X.
Este código simplemente verifica que ambos TextCtrls tengan algún texto antes de habilitar el botón Listo
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()
Solución
Puede intentar event.GetId ()
o event.GetEventObject ()
y ver si alguno de estos funciona.
Otro enfoque para esto es usar lambda o functools.partial para pasar efectivamente un parámetro al controlador. Entonces, por ejemplo, suba en las líneas a continuación en su programa:
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
Y luego ob será entry
o entry2
según el panel en el que se haga clic. Pero, por supuesto, esto no debería ser necesario, y GetId y GetEventObject () deberían funcionar, aunque (todavía) no tengo una Mac para probarlos.