Python tkinter(copy/paste 不适用于其他语言)
Python tkinter (copy/paste not working with other languages)
我发现每当我将语言从英语切换到俄语时,tkinter 就会停止对 Ctrl+C、Ctrl+V或Ctrl+X。
当我切换回英语时它仍然有效,即使文本是俄语。
我尝试了所有我能在堆栈交换中找到的与复制粘贴主题远程相关的代码片段,添加了类似于原始代码的内容,如 self.bind('<Control-м>', self.paste)
(“м”在俄语中与 [=33 是同一个按钮=] 英文),但仍然没有任何效果。
非常感谢 help/ideas 如何修复它。
您可以使用<Key>
检查当您按下Control-м
时使用的是什么keycode
,然后使用它在Tcl/Tk - keysym之类的页面上查找keysym
.也许你将不得不使用 <Control-Cyrillic_em>
import tkinter as tk
def copy(event):
print('copy')
def paste(event):
print('paste')
def test(event):
print('event.char:', event.char)
print('event.keycode:', event.keycode)
print('event.keysym:', event.keysym)
print('---')
root = tk.Tk()
root.bind('<Key>', test)
root.bind('<Control-c>', copy)
root.bind('<Control-v>', paste)
root.bind('<Control-Cyrillic_em>', paste)
root.mainloop()
from Tkinter import Tk, Entry
def _onKeyRelease(event):
ctrl = (event.state & 0x4) != 0
if event.keycode==88 and ctrl and event.keysym.lower() != "x":
event.widget.event_generate("<<Cut>>")
if event.keycode==86 and ctrl and event.keysym.lower() != "v":
event.widget.event_generate("<<Paste>>")
if event.keycode==67 and ctrl and event.keysym.lower() != "c":
event.widget.event_generate("<<Copy>>")
master = Tk()
master.geometry("500x500+1+1")
master.bind_all("<Key>", _onKeyRelease, "+")
Entry(master).pack()
Entry(master).pack()
Entry(master).pack()
master.mainloop()
我做到了。
1.First 根据 here:
的建议收到当前布局语言
def is_ru_lang_keyboard(self):
u = ctypes.windll.LoadLibrary("user32.dll")
pf = getattr(u, "GetKeyboardLayout")
return hex(pf(0)) == '0x4190419'
2。然后我定义了考虑布局的keys()方法,因为在英文布局的情况下没有条件,该方法在插入时给出了重复的字符串:
def keys(event):
if self.is_ru_lang_keyboard():
if event.keycode==86:
event.widget.event_generate("<<Paste>>")
if event.keycode==67:
event.widget.event_generate("<<Copy>>")
if event.keycode==88:
event.widget.event_generate("<<Cut>>")
if event.keycode==65535:
event.widget.event_generate("<<Clear>>")
if event.keycode==65:
event.widget.event_generate("<<SelectAll>>")
3.Bound“Control-KeyPress”事件的Entry字段的keys()方法:
self.my_entry.bind("<Control-KeyPress>", keys)
我发现每当我将语言从英语切换到俄语时,tkinter 就会停止对 Ctrl+C、Ctrl+V或Ctrl+X。
当我切换回英语时它仍然有效,即使文本是俄语。
我尝试了所有我能在堆栈交换中找到的与复制粘贴主题远程相关的代码片段,添加了类似于原始代码的内容,如 self.bind('<Control-м>', self.paste)
(“м”在俄语中与 [=33 是同一个按钮=] 英文),但仍然没有任何效果。
非常感谢 help/ideas 如何修复它。
您可以使用<Key>
检查当您按下Control-м
时使用的是什么keycode
,然后使用它在Tcl/Tk - keysym之类的页面上查找keysym
.也许你将不得不使用 <Control-Cyrillic_em>
import tkinter as tk
def copy(event):
print('copy')
def paste(event):
print('paste')
def test(event):
print('event.char:', event.char)
print('event.keycode:', event.keycode)
print('event.keysym:', event.keysym)
print('---')
root = tk.Tk()
root.bind('<Key>', test)
root.bind('<Control-c>', copy)
root.bind('<Control-v>', paste)
root.bind('<Control-Cyrillic_em>', paste)
root.mainloop()
from Tkinter import Tk, Entry
def _onKeyRelease(event):
ctrl = (event.state & 0x4) != 0
if event.keycode==88 and ctrl and event.keysym.lower() != "x":
event.widget.event_generate("<<Cut>>")
if event.keycode==86 and ctrl and event.keysym.lower() != "v":
event.widget.event_generate("<<Paste>>")
if event.keycode==67 and ctrl and event.keysym.lower() != "c":
event.widget.event_generate("<<Copy>>")
master = Tk()
master.geometry("500x500+1+1")
master.bind_all("<Key>", _onKeyRelease, "+")
Entry(master).pack()
Entry(master).pack()
Entry(master).pack()
master.mainloop()
我做到了。
1.First 根据 here:
的建议收到当前布局语言def is_ru_lang_keyboard(self):
u = ctypes.windll.LoadLibrary("user32.dll")
pf = getattr(u, "GetKeyboardLayout")
return hex(pf(0)) == '0x4190419'
2。然后我定义了考虑布局的keys()方法,因为在英文布局的情况下没有条件,该方法在插入时给出了重复的字符串:
def keys(event):
if self.is_ru_lang_keyboard():
if event.keycode==86:
event.widget.event_generate("<<Paste>>")
if event.keycode==67:
event.widget.event_generate("<<Copy>>")
if event.keycode==88:
event.widget.event_generate("<<Cut>>")
if event.keycode==65535:
event.widget.event_generate("<<Clear>>")
if event.keycode==65:
event.widget.event_generate("<<SelectAll>>")
3.Bound“Control-KeyPress”事件的Entry字段的keys()方法:
self.my_entry.bind("<Control-KeyPress>", keys)