In wxPython wie bindest du ein EVT_KEY_DOWN-Event an das ganze Fenster?

Ich kann ein event an eine textctrl box np binden. Das Problem ist, dass ich in die Text-Box-Box geklickt werden muss, um diese Veranstaltung zu "fangen". Ich hoffe, jederzeit fangen zu können, wenn jemand die Pfeiltasten drückt, während das Hauptfenster den Fokus hat.

FUNKTIONIERT NICHT:

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 mir ziemlich sicher, dass ich etwas einfaches fehle. Bin aber ein bisschen stecken geblieben

  • Wie man wxpython 2.8 auf Mac OSX 10.6 deinstalliert
  • WxPython: Größe eines Notebooks in einem Notebook
  • Auswählen von Punkten aus einem Diagramm matplotlib
  • Fehler: Fehler beim Baustellenrad für wxpython-phoenix bei der Installation von wx
  • Python: Pluging wx.py.shell.Shell in einen separaten Prozess
  • Python Callback von SWIG PyObject_Call Segfault
  • WxPython: wie man die Quelle eines Ereignisses bestimmt
  • Wie man eine WxPython-Anwendung tötet, wenn der Benutzer auf den Rahmen eines Frames klickt
  • 2 Solutions collect form web for “In wxPython wie bindest du ein EVT_KEY_DOWN-Event an das ganze Fenster?”

    Versuchen Sie stattdessen, an wx.EVT_CHAR_HOOK zu wx.EVT_CHAR_HOOK

    z.B.

     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() 

    Sie könnten EVT_CHAR_HOOK verwenden,

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

    Oder einen Beschleunigertisch verwenden

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

    Sie müssen eine Schaltfläche oder Widgets ID in der Beschleunigungstabelle verwenden, und durch Drücken der Taste wird der Widgets-Event-Handler ausgelöst.

    Wenn du keine Widgets hast, die du möchtest, dass ihre Events ausgelöst werden und lieber irgendwie ein "unsichtbares" Widget mit Eventbindungen haben, dann kannst du das machen:

      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) 

    Ich Iteration über die interessierten Schlüssel zu binden, und erstellen Sie neue Widgets IDs für sie. Ich benutze diese IDs, um Menüpunkte zu binden (welche Beschleunigertasten auslösen) und diese IDs in der Liste der Tupel der Beschleunigertabelle verwenden.

    Python ist die beste Programmiersprache der Welt.