2010-08-25 4 views
15

Ich kann ein Ereignis an eine textctrl Box np binden. Das Problem ist, dass ich innerhalb der Textctrl-Box angeklickt werden muss, um dieses Ereignis zu "fangen". Ich hoffe, in der Lage zu sein, jederzeit zu fangen, wenn jemand die Pfeiltasten drückt, während das Hauptfenster den Fokus hat.In WxPython wie binden Sie ein Ereignis EVT_KEY_DOWN an das gesamte Fenster?

NICHT ARBEITEN:

wx.EVT_KEY_DOWN(self, self.OnKeyDown) 

ARBEITEN:

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

Ich bin ziemlich sicher, dass ich etwas am easy fehlt. Allerdings bin ich ein bisschen fest.

+0

Sorry, wie binden Sie das Key Down-Ereignis an das Textfeld? Das ist genau das, was ich brauche! 'wx.EVT_KEY_DOWN (self.NudgeTxt, self.OnKeyDown)' scheint bei mir nicht zu funktionieren – phunehehe

Antwort

18

Stattdessen versuchen die Bindung an wx.EVT_CHAR_HOOK

z ..

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

Danke. Das hat es getan. – ril3y

+0

@ ril3y: Dein Willkommen! – volting

+0

Dies ermöglichte meinem Hauptfenster, das Ereignis zu sehen, aber meine Kinder sehen es nicht. Alle meine Handler enthalten event.Skip(). Irgendwelche Vorschläge? – kjgregory

4

Sie EVT_CHAR_HOOK verwenden könnte,

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


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

oder verwenden Sie einen Beschleuniger Tisch

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

werden Sie n Wenn Sie eine Schaltfläche oder Widgets ID in der Accelerator-Tabelle verwenden möchten, wird durch Drücken der Schaltfläche der Ereignishandler der Widgets ausgelöst.

Wenn Sie haben keine Widgets, die Sie ihre Veranstaltungen möchten ausgelöst werden, und würde eher eine Art von „unsichtbaren“ Widget, das Ereignisbindungen hat, dann können Sie dies tun:

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) 

I iterieren über die interessierten Schlüssel zu binden, und erstellen Sie neue Widgets IDs für sie. Ich verwende dann diese IDs, um Menüelemente an (welche Beschleunigungstasten auszulösen) zu binden und diese IDs in der Tupelliste der Beschleunigungstabelle zu verwenden.

Verwandte Themen