在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会将您切换为俄语,您将能够键入以下有趣的符号:
另一个Alt-Shift会让你回头。
忘记维基百科关于语音俄语布局的内容。这些天他们没用过。至少在俄罗斯境内。
所有Windows应用程序(包括wxPython应用程序)都使用Ctrl-я
进行撤消,Ctrl-ч
进行剪切,Ctrl-с
进行复制等等。
答案 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')
它有效!