Events 不使用pyhook的情况下在wxPython中按下事件键

Events 不使用pyhook的情况下在wxPython中按下事件键,events,event-handling,wxpython,keypress,Events,Event Handling,Wxpython,Keypress,好吧,我已经想出了一些代码来检查按下了什么键,它现在非常基本,但随着我的进步,我将在这里更新,重点是在每次按键事件发生时按下一个键 import wx class Example(wx.Frame): def __init__(self, *args,**kw): super(Example, self).__init__(*args,**kw) self.InitUI() def InitUI(self): #frame = w

好吧,我已经想出了一些代码来检查按下了什么键,它现在非常基本,但随着我的进步,我将在这里更新,重点是在每次按键事件发生时按下一个键

import wx

class Example(wx.Frame):
    def __init__(self, *args,**kw):
        super(Example, self).__init__(*args,**kw)
        self.InitUI()
    def InitUI(self):
        #frame = wx.Frame(self, style=wx.FRAME_DRAWER | wx.STAY_ON_TOP, size = (100, 100))
        #pnl= wx.Panel(frame)
        pnl= wx.Panel(self)    
        pnl.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.st1 = wx.StaticText(self, label='', pos=(30, 10))
        pnl.SetFocus()
        self.SetSize((250,180))
        self.SetTitle('Key Press Event')
        self.Centre()
        self.Show(True)

    def OnKeyDown(self, e):
        key = e.GetKeyCode()
        if  key==wx.WXK_ESCAPE:
            self.st1.SetLabel("ESCAPE")
        elif key ==wx.WXK_CONTROL:
            self.st1.SetLabel("CTRL")
        elif key==wx.WXK_ALT:
            self.st1.SetLabel("ALT")
        elif key==wx.WXK_BACK:
            self.st1.SetLabel("BACKSPACE")
        elif key== wx.WXK_EXECUTE:
            self.st1.SetLabel("ENTER KEY")
def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()

if __name__=='__main__':
    main()

我正在尝试创建一个无边框的窗口,但是即使我将面板放在一个style=frame\u DRAWER的框架中,它也不起作用,顶部的支架也不起作用,因此这两行都有注释,请查看是否可以起作用

面板倾向于吃掉关键事件或将它们传递给其他小部件。看

哪些链接到旧线程:

引用wxPython的创始人罗宾·邓恩的话:

  • 将密钥事件处理程序绑定到所有小部件

  • *捕获EVT_CHILD_FOCUS事件,并将焦点重置回您需要的位置 只要焦点转移到一个孩子身上,你就会想要它*

  • 使用wx.AcceleratorTable而不是按键事件,因此按键 无论应用程序中的哪个小部件 焦点

  • 将密钥处理程序绑定到应用程序而不是框架。全部的 未处理的事件在被放弃之前发送到应用程序对象, 因此,无论哪个小部件有焦点,如果它不处理关键事件 然后应用程序将有机会使用它


您可能也会发现我以前的关于密钥事件的内容很有启发性。

如何将密钥处理程序绑定到应用程序…
?你能提供一个小例子@MikeDriscoll吗?你指的是
加速表吗?这可能是抓住某些钥匙的最简单方法。否则,您将不得不连接到操作系统级别的东西。无论哪个小部件具有焦点,我们都能用
AcceleratorTable
捕获
CTRL+S
吗?你能举一个简单的例子吗?我相信只要你的应用程序有重点,它在大多数情况下都能工作。可能有一些我现在没有想到的边缘案例,因为除了好玩,我在目前的工作中不使用wxPython。以下是我写的一篇关于这个主题的文章: