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()
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top