【问题标题】:key pressed event in wxPython without using pyhookwxPython中的按键事件而不使用pyhook
【发布时间】:2012-10-29 06:24:05
【问题描述】:

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

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_DRAWER 的框架中,它也不起作用,STAY_ON_TOP 也不起作用,所以这两行被注释了,请看看你是否可以让它工作。 .

【问题讨论】:

    标签: events event-handling wxpython keypress


    【解决方案1】:

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

    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 代替按键事件,所以按键 无论应用程序中的哪个小部件都将变成菜单事件 焦点。

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

    您可能还会发现我在关键事件上的旧 tutorial 也很有启发性。

    【讨论】:

    • how to bind your key handler to the app instead ... ?你能提供一个小例子@MikeDriscoll 吗?
    • 你指的是AcceleratorTable吗?这可能是捕捉某些键的最简单方法。否则,您将不得不陷入操作系统级别的问题。
    • 无论哪个小部件有焦点,我们都能用AcceleratorTable 捕获CTRL + S 吗?你有一个最小的例子吗?
    • 我相信只要您的应用程序具有焦点,它在大多数情况下都会起作用。可能有一些我现在没有想到的极端情况,因为我在目前的工作中不使用 wxPython,除非是为了好玩。这是我写的关于该主题的文章:blog.pythonlibrary.org/2010/12/02/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2013-03-12
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多