【问题标题】:wxPython: binding wx.EVT_CHAR_HOOK disables TextCtrl backspacewxPython:绑定 wx.EVT_CHAR_HOOK 禁用 TextCtrl 退格
【发布时间】:2013-12-23 09:02:03
【问题描述】:

我有一个 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,当我输入 TextCtrl 时,我无法再使用 LEFT RIGHT BACKSPACE SHIFT。

有什么建议吗?

【问题讨论】:

    标签: python events wxpython keypress wxtextctrl


    【解决方案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()
    

    【讨论】:

    • 我们可以只在函数 OnKeyDown 中包含 WXK_RETURN 而不使用 EVT_KEY_UP 吗?
    • 由于某种原因,RETURN 键未注册为wx.EVT_KEY_DOWN
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多