Tkinter国际绑定

时间:2013-01-22 09:48:59

标签: python tkinter bind scancodes

在Tkinter中是否有办法绑定可在所有键盘布局中使用的键组合? (通过扫描码绑定)

例如,我需要'Control-Z'绑定,它将与所有布局中键盘左下角的相同物理键一起使用,例如:
*俄罗斯布局,
*希腊布局等。

这是我试过的:

from Tkinter import *
root=Tk()
def f(event):
    print 'undo'
button1=Button(root, text=u'Button')
button1.pack()
button1.bind('<Control-z>', f)
root.mainloop()

它不适用于俄语和希腊语键盘布局。

更新-2:

我在Windows上做了一些实验,现在一般规则是这样的:

1)如果语言基于拉丁字符集,则按“按值”(德语法语 Dvorak )映射键以便将相同的动作映射到不同的物理键 2)如果不是(例如 俄语希腊语),那么所有主要加速器都会“按位置”映射(以匹配相应的英语)字母通常标在同一个键上。

只有第二种情况需要特别注意。如果已经在某些lib中实现了这个想法吗?

更新-3

即使没有俄语键盘或俄语Windows也可以简单地再现。

1)开始 - &gt;控制面板 - &gt;区域和语言选项
2)语言 - &gt;细节
3)添加俄语。

就是这样。现在,Alt-Shift会将您切换为俄语,您将能够键入以下有趣的符号:

Russian keyboard

另一个Alt-Shift会让你回头。

忘记维基百科关于语音俄语布局的内容。这些天他们没用过。至少在俄罗斯境内。

所有Windows应用程序(包括wxPython应用程序)都使用Ctrl-я进行撤消,Ctrl-ч进行剪切,Ctrl-с进行复制等等。

5 个答案:

答案 0 :(得分:1)

感谢@ acw1668寻求帮助!

您需要执行以下操作才能在任何语言布局中使用热键(此示例的回调在按下Control键时运行,并打印与Control同时按下的键:

from tkinter import *


def callback(event):
    if (event.state & 4 > 0):
        print("Ctrl-%s pressed" % chr(event.keycode))

root = Tk()
root.bind("<Key>", callback)
root.mainloop()

PS:使用英语,俄语,乌克兰语,阿拉伯语,阿姆哈拉语,亚美尼亚语,希腊语,格鲁吉亚语,法语,中文,日语和其他语言布局时,检查了此示例。

答案 1 :(得分:0)

我最感兴趣的是Windows中的俄语布局。

我目前使用的快速而肮脏的解决方法是:

import Tkinter

def copy(event):
    print 'Ctrl-C'

root = Tkinter.Tk()
root.bind('<Control-ntilde>', copy)
root.mainloop()

可能会导致与&lt; Ctrl + 实际 ntilde&gt;冲突用其他语言。

如果我可以确定哪个布局当前有效,则可以克服,因此第二个问题:Tkinter determine keyboard layout

另一个缺点是由于修改键的“通用”处理,当我按下Ctrl-Alt-V时它也会触发,但这也是另一个故事,因为它也适用于英文版面。

答案 2 :(得分:0)

1999年的另一个选项suggested是从Tkinter切换到wxPython,自动对所有类型的键盘布局进行加速器处理(例如编辑器示例:http://wiki.wxpython.org/AnotherTutorial)。

答案 3 :(得分:0)

我有一个部分而且相当丑陋的解决方案。在下面的代码中,我有一个带有Text小部件的窗口,它在标准的 Ctrl + C 键盘事件之间有一些“内置”连接,他们妥善处理。但是,如果我只是将键盘布局更改为俄语,则这些功能不再起作用。为了解决这个问题,我重新编写了这些事件的实现,现在一切正常。但我对这样的解决方案感到有点沮丧。有没有人有更好的想法?..例如,有没有办法在python tkinter中触发(或模仿)“普通”按键?

import tkinter

root = tkinter.Tk()

class MyWind (tkinter.Frame):
    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        self.create_UI()

    def create_UI(self):
        text_field = tkinter.Text(self)
        text_field.insert(tkinter.END, "Hello world")
        text_field.pack()

def print_event(event):
    print ("Event character code <char>: '%s'" % event.char)
    print ("   Event key symbol <keysym>: '%s'" % event.keysym)
    print ("   Event key code <keycode>: '%s'" % event.keycode)

def work_out_event(event): # Here is the solution
    widget_type = type(event.widget)
    if widget_type == tkinter.Text:
        content = event.widget.selection_get()
        print ("Selected content = '%s'" % content)
        root.clipboard_clear() 
        root.clipboard_append(content)

def lurker1(event):
    print ("Crtl + C (english) pressed!")       
    print_event(event)

def lurker2(event):
    print ("Crtl + C (russian) pressed!")
    print_event(event)
    work_out_event(event)        

root.bind("<Control-c>", lurker1)      # "C" character with the english keyboard layout
root.bind("<Control-ntilde>", lurker2) # "C" character with the russian keyboard layout

root.app = MyWind(root)
root.app.pack()
root.mainloop()

答案 4 :(得分:0)

def copy(event):
    print 'Ctrl-C'
    master.clipboard_append('text')

它有效!