在Python+tkinter中处理Tk键盘事件混乱的更好方法?

2024-04-26 05:48:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个tkinter应用程序,它可以响应数字键盘上的单个按键。我发现处理numpad按键的tk事件是一件非常痛苦的事情,因为我尝试过的所有平台都会导致完全不同的事件(windows、mac、linux),而且我能找到的文档要么不完整要么就是错误。我的主要文档源是http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/key-names.html

只有Linux看起来“正常”,并允许您获取tkkeysym名称,例如“KPˉEnter”。然而,Windows要求您查看keysym_num或{},这取决于您是否想正确地处理NumLock的开/关,但似乎仍然无法区分某些numpad键和它们的普通等价物(+/+,Enter/Return等)OSX,要求您查看keycode,它们又完全不同了。在

例如,numpad上的'0'键:

  • Linux:event.keysym == 'KP_0'
  • 窗口:event.keysym_num == 65379 或者启用Numlock时:event.keycode == 96
  • Mac操作系统: event.keycode == 5374000

我是不是漏了点东西,还是真的这么乱?有没有更好的解决办法我忽略了?


在我的代码中,我在主窗口上绑定了keyup/down事件:

class NumpadmadnessWindow(tkinter.Tk):
    def __init__(self):
        super().__init__()
        # ...
        self.bind("<KeyPress>", self.keypress)
        self.bind("<KeyRelease>", self.keyrelease)

出于调试目的,我的事件处理程序如下所示:

^{pr2}$

一个小的可运行的测试应用程序的完整代码我认为并不真正相关,但可以在这里找到:https://gist.github.com/irmen/2c9d6bb0afb16b464805410c108a2885


Tags: 代码文档selfevent应用程序tkinterlinux事件