当我将键盘切换到俄语布局时,我的小部件会获取带有一些变音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
为:ocircumflex
、ucircumflex
、acircumflex
、agrave
。
虽然我自然希望得到Cyrillic_ef
,Cyrillic_yeru
等。
同时,如果我在Entry
中键入文本,俄语字母会正确插入。
关于正在发生的事情以及如何解决的任何想法?也就是说,也许它甚至不需要修复(它可能允许对任何非英语键盘布局使用相同的绑定),但我仍然想知道这种高度违反直觉的效果的原因,包括如果它是设计使然。
根据我的发现,这取决于您使用的系统。从这里的答案来看,对于 Windows,您必须将键绑定中的'<Control-ntilde>'
之类的东西组合在一起,这样您就可以做'<Control-ocircumflex>'
、'<Control-ucircumflex>'
、...
在OSX中,我什至不确定如何做到这一点。我尝试了适用于Windows的示例,但无法让它注册按键。 对于Linux,我无法尝试。
编辑:为了实际回答您的问题,基本上当Tk将系统传递的虚拟键代码转换为Tk窗口时,它使用函数TkpGetKeySym()
,而该函数又调用WindowsToAscii()
函数。此函数在处理时将考虑当前活动键盘映射,即使它仅设计为返回 Latin-1 字符的代码。俄语的特定键盘映射是 Windows-1251,当调用TkpGetKeySym()
但调用方将输出解释为拉丁语 1 时,会使用它。有修复吗?似乎不是。我基本上只是(试图)总结这个页面的内容,所以我建议阅读它以获得更深入的解释,并检查我是否误读了什么。