2010-08-25 40 views
15

Puedo vincular un evento a un cuadro textctrl np. El problema es que tengo que hacer clic dentro del cuadro textctrl para "atrapar" este evento. Espero poder atrapar cada vez que alguien presiona las teclas de flecha mientras la ventana principal tiene foco.En wxPython, ¿cómo vincular un evento EVT_KEY_DOWN a toda la ventana?

NO TRABAJO:

wx.EVT_KEY_DOWN(self, self.OnKeyDown) 

DE TRABAJO:

self.NudgeTxt = wx.TextCtrl(self.panel, size=(40,20), value=str(5)) 
wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown) 

Estoy bastante seguro de que me falta algo fácil. Sin embargo, estoy un poco atascado.

+0

Disculpe, ¿cómo enlaza el evento de tecla hacia abajo al cuadro de texto? porque eso es justo lo que necesito! 'wx.EVT_KEY_DOWN (self.NudgeTxt, self.OnKeyDown)' no parece funcionar para mí – phunehehe

Respuesta

18

lugar intente unirse a wx.EVT_CHAR_HOOK

por ejemplo ..

self.Bind(wx.EVT_CHAR_HOOK, self.onKey) 

    ... 

def onKey(self, evt): 
    if evt.GetKeyCode() == wx.WXK_DOWN: 
     print "Down key pressed" 
    else: 
     evt.Skip() 
+0

Thanks volting. Eso lo hizo. – ril3y

+0

@ ril3y: ¡Bienvenido! – volting

+0

Esto permitió que mi ventana principal viera el evento, pero mis hijos no lo ven. Todos mis controladores incluyen event.Skip(). ¿Alguna sugerencia? – kjgregory

4

Usted podría utilizar EVT_CHAR_HOOK,

self.Bind(wx.EVT_CHAR_HOOK, self.hotkey) 


def hotkey(self, event): 
    code = event.GetKeyCode() 
    if code == wx.WXK_LEFT: # or whatever... 
     ... 

o utilizar una tabla de aceleradores

ac = [(wx.ACCEL_NORMAL, wx.WXK_LEFT, widget.GetId())] 
    tbl = wx.AcceleratorTable(ac) 
    self.SetAcceleratorTable(tbl) 

que van a n Es necesario utilizar un botón o una identificación de widgets en la tabla del acelerador, y presionar el botón activará el manejador de eventos de los widgets.

Si no tiene widgets que desea sus eventos para ser activado, y prefiere algún tipo de control "invisible" que tiene enlaces de eventos, entonces usted puede hacer esto:

ac = [] 
    keys = [wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, wx.WXK_DOWN] 
    for key in keys: 
     _id = wx.NewId() 
     ac.append((wx.ACCEL_NORMAL, key, _id)) 
     self.Bind(wx.EVT_MENU, self.your_function_to_call, id=_id) 

    tbl = wx.AcceleratorTable(ac) 
    self.SetAcceleratorTable(tbl) 

que iterar sobre las claves interesadas para enlazar y crear nuevos ID de widgets para ellos. Luego utilizo estos ID para vincular los elementos del menú a (qué teclas del acelerador activan) y uso estos ID en la lista de tuplas de la tabla del acelerador.

Cuestiones relacionadas