wxPython: manejo de eventos en un widget que está dentro de un cuaderno
-
05-07-2019 - |
Pregunta
Tengo un cuaderno wxPython, en este caso un wx.aui.AuiNotebook
. (pero este problema también ha ocurrido con otros tipos de cuadernos). En mi cuaderno tengo un widget, en este caso una subclase de ScrolledPanel
, para el cual estoy tratando de hacer un manejo de eventos personalizado ( para wx.EVT_KEY_DOWN
). Sin embargo, los eventos no están siendo manejados. Revisé mi código fuera del cuaderno, y el manejo de eventos funciona, pero cuando coloco mi widget en el cuaderno, el controlador de eventos no parece ser invocado cuando ocurre el evento.
¿El cuaderno de alguna manera bloquea el evento? ¿Cómo resuelvo esto?
Solución
Intenté reproducir tu problema pero funcionó bien para mí. Lo único en lo que puedo pensar es que hay una de sus clases que también se enlaza a wx.EVT_KEY_DOWN
y no llama a wx.Event.Skip () en su devolución de llamada. Eso evitaría un mayor manejo del evento. Si su panel desplazado se encuentra en una secuencia descendente de dicho objeto en la secuencia de controladores de eventos, nunca verá el evento.
Para referencia, aquí hay un ejemplo que me funcionó (en Windows). ¿Es lo que estás haciendo muy diferente a esto?
import wx
import wx.aui, wx.lib.scrolledpanel
class AppFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
# The notebook
self.nb = wx.aui.AuiNotebook(self)
# Create a scrolled panel
panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1)
panel.SetupScrolling()
self.add_panel(panel, 'Scrolled Panel')
# Create a normal panel
panel = wx.Panel(self, -1)
self.add_panel(panel, 'Simple Panel')
# Set the notebook on the frame
self.sizer = wx.BoxSizer()
self.sizer.Add(self.nb, 1, wx.EXPAND)
self.SetSizer(self.sizer)
# Status bar to display the key code of what was typed
self.sb = self.CreateStatusBar()
def add_panel(self, panel, name):
panel.Bind(wx.EVT_KEY_DOWN, self.on_key)
self.nb.AddPage(panel, name)
def on_key(self, event):
self.sb.SetStatusText("key: %d [%d]" % (event.GetKeyCode(), event.GetTimestamp()))
event.Skip()
class TestApp(wx.App):
def OnInit(self):
frame = AppFrame(None, -1, 'Click on a panel and hit a key')
frame.Show()
self.SetTopWindow(frame)
return 1
if __name__ == "__main__":
app = TestApp(0)
app.MainLoop()