7

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)如果语言是基于拉丁字符集的,键被“按值”映射(德语法语德沃夏克语),以便将相同的动作映射到不同的物理键。
    2) 如果不是(例如 俄语希腊语),则所有主要加速键都“按位置”映射(以匹配通常标记在同一键上的相应英文字母)。

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

更新 3

即使没有俄语键盘或俄语 Windows,它也可以简单地复制。

1) 开始->控制面板->区域和语言选项
2) 语言->详细信息
3) 添加俄语。

而已。现在 Alt-Shift 会将您切换到俄语,您将能够输入以下有趣的符号:

俄语键盘

另一个 Alt-Shift 将使您切换回来。

忘记 Wikipedia 所说的有关语音俄语布局的内容。这些天没有使用它们。至少在俄罗斯境内。

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

4

5 回答 5

1

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

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

import Tkinter

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

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

这可能会导致与其他语言中的 <Ctrl + actual ntilde> 发生冲突。

如果我可以确定哪个布局当前处于活动状态,则可以克服它,因此第二个问题:Tkinter 确定键盘布局

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

于 2013-01-23T08:04:34.070 回答
1

我对此有一个部分且相当丑陋的解决方案。Ctrl在下面的代码中,我有一个带有 Text 小部件的窗口,它在标准+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()
于 2014-08-20T19:06:00.457 回答
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:本示例在 Windows 10 上使用英语、乌克兰语、俄语、阿拉伯语、阿姆哈拉语、亚美尼亚语、希腊语、格鲁吉亚语、法语、中文、日语和其他语言布局时进行了检查。

于 2019-12-12T16:41:48.943 回答
0

旧的 1999 年已经建议的另一个选择是从 Tkinter 切换到 wxPython,其中自动为所有类型的键盘布局完成加速器处理(例如,此处的编辑器示例:http ://wiki.wxpython.org/AnotherTutorial )。

于 2013-01-23T09:16:08.907 回答
0
def copy(event):
    print 'Ctrl-C'
    master.clipboard_append('text')

它有效!

于 2014-12-06T11:04:39.607 回答