列表框获取带有音调符号而不是国家/地区字符的"键"事件



当我将键盘切换到俄语布局时,我的小部件会获取带有一些变音keysym符号的关键事件,而不是俄语字母。

下面是一个演示(使用dump模块):

import Tkinter as tkinter
from dump import dump
def show_event(e):
dump(e)
root=tkinter.Tk()
lb = tkinter.Listbox(root)
lb.grid()
root.bind_class('Listbox','<Control-Key>', show_event)
root.mainloop()

现在,当我聚焦列表框并按带有字母фыва(对应于asdf)的Ctrl时,打印事件中的keysym为:ocircumflexucircumflexacircumflexagrave

虽然我自然希望得到Cyrillic_efCyrillic_yeru等。

同时,如果我在Entry中键入文本,俄语字母会正确插入。

关于正在发生的事情以及如何解决的任何想法?也就是说,也许它甚至不需要修复(它可能允许对任何非英语键盘布局使用相同的绑定),但我仍然想知道这种高度违反直觉的效果的原因,包括如果它是设计使然。

根据我的发现,这取决于您使用的系统。从这里的答案来看,对于 Windows,您必须将键绑定中的'<Control-ntilde>'之类的东西组合在一起,这样您就可以做'<Control-ocircumflex>''<Control-ucircumflex>'、...

在OSX中,我什至不确定如何做到这一点。我尝试了适用于Windows的示例,但无法让它注册按键。 对于Linux,我无法尝试。

编辑:为了实际回答您的问题,基本上当Tk将系统传递的虚拟键代码转换为Tk窗口时,它使用函数TkpGetKeySym(),而该函数又调用WindowsToAscii()函数。此函数在处理时将考虑当前活动键盘映射,即使它仅设计为返回 Latin-1 字符的代码。俄语的特定键盘映射是 Windows-1251,当调用TkpGetKeySym()但调用方将输出解释为拉丁语 1 时,会使用它。有修复吗?似乎不是。我基本上只是(试图)总结这个页面的内容,所以我建议阅读它以获得更深入的解释,并检查我是否误读了什么。

最新更新