当我使用IDLE执行任务时,我首先注意到了这一点,但它也显示在我自己的tkinter程序中。许多键盘上有两组箭头键,常用箭头键通常位于空格键行旁边,键盘上有箭头键,当打开numlock时,它们会成为数字输入键。在tkinter中,两组在按下时会产生不同的事件名称。
我的问题是,当使用各种内置的tkinter小部件时,例如Text和Entry,默认的tkinter行为似乎是忽略键盘事件。我希望我的程序能够同时处理两组。
我希望有一种相对简单的方法来实现这一点,例如在导入后在模块中设置变量,或者将KP_ *事件绑定到函数,然后将相应的常规箭头键事件发送回我的小部件。然而,我发现甚至承认存在这个怪癖的唯一的事情是this其他未答复的Stack Overflow问题。
答案 0 :(得分:0)
因此,在挖掘了更多内容后,我创建了此函数以将事件转发到另一个事件名称。它可能有许多潜在的改进,但这是一般的想法。
在要重新映射事件的窗口小部件上调用该函数,在根窗口小部件上调用该函数将至少为所有其他未绑定到其他任何窗口小部件的窗口小部件重新映射事件。
可以使用kmap
变量将哪些事件转换为哪些其他事件。如果这样做,请确保转发中没有任何循环,此功能不会进行完整性检查。
我只在这里复制了原始事件的修饰键状态,因为这足以让它做我想要的,但在某些情况下你可能需要复制更多的信息。
我在key event information的链接中找到了Python docs for tkinter。我从同一来源获得了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)