wxPython: привязка wx.EVT_CHAR_HOOK отключает возврат текста TextCtrl
У меня есть wx.TextCtrl, и я хочу иметь возможность набирать его, но также обнаруживать нажатия клавиш, такие как UP, DOWN, RETURN, ESC.
Поэтому я связал 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 я больше не могу использовать LEFT RIGHT BACKSPACE SHIFT, когда я печатаю в TextCtrl.
Какие-либо предложения?
1 ответ
Решение
Вам следует позвонить 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()