1

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

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

我正在尝试为此设置一个无边框窗口,但即使我将面板放在样式= FRAME_DRAWER 的框架中它也不起作用,STAY_ON_TOP 也没有,所以这两行被注释了,请看看你是否可以让它工作..

4

1 回答 1

2

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

http://wxpython-users.1045709.n5.nabble.com/Catching-key-events-from-a-panel-and-follow-up-to-stacked-panels-td2360109.html

链接到旧线程:http ://article.gmane.org/gmane.comp.python.wxpython/50485

引用 wxPython 的创建者 Robin Dunn 的话:

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

  • *捕获 EVT_CHILD_FOCUS 事件并将焦点重置回您想要的位置,只要焦点更改为孩子。*

  • 使用 wx.AcceleratorTable 代替按键事件,因此无论应用程序中的哪个小部件具有焦点,按键都会变成菜单事件。

  • 将您的密钥处理程序绑定到应用程序而不是框架。所有未处理的事件在被放弃之前都会发送到应用程序对象,因此无论哪个小部件具有焦点,如果它本身不处理关键事件,那么应用程序将有机会获得它。

您可能还会发现我关于关键事件的旧教程也很有启发性。

于 2012-10-31T18:03:31.267 回答