【问题标题】:Make widget treat numpad arrows the same way as the other arrow keys使小部件以与其他箭头键相同的方式处理小键盘箭头
【发布时间】:2016-09-21 01:01:12
【问题描述】:

我在使用 IDLE 执行任务时第一次注意到这一点,但它也出现在我自己的 tkinter 程序中。许多键盘上有两组箭头键,通常位于空格键行旁边的常规箭头键和键盘上的箭头键,当打开数字锁定时,它们兼作数字输入键。在 tkinter 中,这两个集合在按下时会产生不同的事件名称。

我的问题是,当使用各种内置的 tkinter 小部件(例如 Text 和 Entry)时,默认的 tkinter 行为似乎是忽略键盘事件。我想让我的程序对这两个集合一视同仁。

我希望有一个相对简单的方法来实现这一点,例如在我导入模块后在模块中设置一个变量,或者将 KP_* 事件绑定到函数,然后将相应的常规箭头键事件发送回我的小部件.然而,我发现唯一承认存在这个怪癖的只有 this 其他未回答的 Stack Overflow 问题。

【问题讨论】:

  • 10 键向上箭头类似于“KP_Up”,当按下一个键时,对于 event.keysym,正常的向上箭头只是“向上”。希望这足以让您找到一个好的答案。键符和键码列表位于 p65 和 66(法语)ateliers.mse.free.fr/tkinter/tkinter-ref5.pdf
  • 因此您可以将多个键事件绑定到一个条目,例如,转到同一个函数。您还可以捕获任何关键事件并过滤您希望程序响应的事件。一个简单的例子会有所帮助。如果您希望 10 键向上箭头在文本中向上移动一行,您可能必须自己编程,即将光标向上移动一行。
  • 谢谢,我知道 KP_arrow 与箭头事件名称。我已经考虑过自己对小部件状态的更改进行编程,尽管这会导致另一个问题(在询问之前我需要研究)关于如何访问小部件的内部状态。

标签: python tkinter


【解决方案1】:

所以在挖掘了更多之后,我创建了这个函数来将事件转发到另一个事件名称。它可能有许多潜在的改进,但这是一般的想法。

在您要为其重新映射事件的小部件上调用该函数,在根小部件上调用它会重新映射至少所有其他未绑定到任何其他小部件的事件。

可以使用kmap 变量更改将哪些事件转换为哪些其他事件。如果这样做,请确保您的转发中没有任何循环,此函数执行零完整性检查。

我在这里只复制了原始事件的修饰键状态,因为这足以让它完成我想要的操作,但在某些情况下您可能需要复制更多信息。

我从Python docs for tkinter 的链接中找到了key event information。我从同一来源获得了 event_generate()event property information

请注意,此解决方案虽然适用于我的简单问题,但在应用于更复杂的情况时可能需要更加小心。

def fix_keypad(widget):
    kmap = {
        '<KP_Left>': '<Left>',
        '<KP_Right>': '<Right>',
        '<KP_Up>': '<Up>',
        '<KP_Down>': '<Down>',
        '<KP_Home>': '<Home>',
        '<KP_End>': '<End>',
        '<KP_Next>': '<Next>',
        '<KP_Prior>': '<Prior>',
        '<KP_Enter>': '<Return>',
    }
    for i in kmap:
        def mfunc(event, key=i):
            widget.event_generate(kmap[key], **{'state': event.state})
        widget.bind(i, mfunc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2011-12-20
    • 2018-06-30
    相关资源
    最近更新 更多