列表框使用变音符号而不是国家字符获取“键”事件

时间:2018-02-26 06:14:29

标签: python tkinter keypress tk

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

这是一个演示(使用dump module):

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()

现在,当我关注列表框并按Ctrl字母фыва(对应asdf)时,打印事件中的keysym为:{{ 1}},ocircumflexucircumflexacircumflex

虽然我当然希望获得Cyrillic_ef, Cyrillic_yeru等等。

同时,如果我在agrave中输入文字,则会正确插入俄文字母。

关于发生了什么的任何想法&amp;怎么修?也就是说,也许它甚至没有需要修复(它可能允许一个人使用相同的绑定来进行任何非英语键盘布局)但我仍然想知道这种高度违反直觉的原因效果包括如果它是设计的。

1 个答案:

答案 0 :(得分:1)

根据我的发现,这取决于您使用的系统。从答案here看来,对于Windows,您必须在键绑定中将'<Control-ntilde>'之类的东西一起砍掉,因此您可以执行'<Control-ocircumflex>''<Control-ucircumflex>',。 ..

在OSX中,我什至不知道如何去做。我尝试了适用于Windows的示例,但无法获取它来注册按键。而对于Linux,我一直无法尝试。

编辑:要真正回答您的问题,实质上是在Tk将系统提供的虚拟键码转换到Tk窗口时,它使用函数TkpGetKeySym(),该函数依次称为Windows { {1}}功能。即使仅用于返回Latin-1字符的代码,此函数在处理时也会考虑当前的活动键盘映射。俄语的特定键映射为Windows-1251,在调用ToAscii()时使用,但调用者将输出解释为好像是Latin-1。有解决办法吗?好像没有我基本上只是(试图)总结this page的内容,因此建议您阅读它进行更深入的解释并检查我是否读错了任何内容。