2013-12-06 4 views
2

У меня есть wx.TextCtrl, и я хочу иметь возможность вводить его, но также обнаруживать нажатия клавиш, такие как UP, DOWN, RETURN, ESC.wxPython: привязка wx.EVT_CHAR_HOOK отключает backcpace TextCtrl

Поэтому я привязал wx.EVT_KEY_DOWN, чтобы распознать любое нажатие клавиши, и wx.EVT_CHAR_HOOK сделать то же самое, даже если TextCtrl имеет фокус.

self.Bind(wx.EVT_KEY_DOWN, self.keyPressed) 
self.Bind(wx.EVT_CHAR_HOOK, self.keyPressed) 

нажатий на клавиши UP, DOWN, RETURN, ESC были признаны и работает нормально, но из-за связывания EVT_CHAR_HOOK я не могу использовать ЛЕВЫЙ ПРАВЫЙ BACKSPACE SHIFT больше, когда я набираю в TextCtrl.

Любые предложения?

ответ

3

В конце обработчика событий вы должны позвонить event.Skip(), чтобы развернуть его. Это работает для меня:

import wx 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.text = wx.TextCtrl(self.panel) 
     self.text.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.text.Bind(wx.EVT_KEY_UP, self.OnKeyUp) 

     self.sizer = wx.BoxSizer() 
     self.sizer.Add(self.text, 1) 

     self.panel.SetSizerAndFit(self.sizer) 
     self.Show() 

    def OnKeyDown(self, e):  
     code = e.GetKeyCode() 
     if code == wx.WXK_ESCAPE: 
      print("Escape") 
     if code == wx.WXK_UP: 
      print("Up") 
     if code == wx.WXK_DOWN: 
      print("Down") 
     e.Skip() 

    def OnKeyUp(self, e): 
     code = e.GetKeyCode() 
     if code == wx.WXK_RETURN: 
      print("Return") 
     e.Skip() 


app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
+0

Можно ли включить функцию WXK_RETURN в функцию OnKeyDown и не использовать EVT_KEY_UP? –

+1

По какой-то причине ключ RETURN не был зарегистрирован как 'wx.EVT_KEY_DOWN'. – Fenikso

Смежные вопросы