Проблема в раскладке клавиатуры. Это всё работает (или должно) если раскладка английская. При русской раскладке - буквы другие.
И вроде бы есть решение:
root.event_add('<<Paste>>', '<Control-igrave>')
root.event_add("<<Copy>>", "<Control-ntilde>")
Но в текущем tkinter оно что-то не работает...
Вот рабочий способ, проверено:
def keypress(e):
if e.keycode == 86 and e.keysym != 'v':
cmd_paste()
elif e.keycode == 67 and e.keysym != 'c':
cmd_copy()
elif e.keycode == 88 and e.keysym != 'x':
cmd_cut()
root.bind("<Control-KeyPress>", keypress)
Ну или как я делал:
class MyApp:
def __init__(self, root):
root.bind("<Control-KeyPress>", self.keypress)
# всякое разное
def keypress(self, e):
# Обработчик комбинаций клавиш для вставки, копирования и вырезания
if e.keycode == 86 and e.keysym != 'v':
self.cmd_paste()
elif e.keycode == 67 and e.keysym != 'c':
self.cmd_copy()
elif e.keycode == 88 and e.keysym != 'x':
self.cmd_cut()
def cmd_copy(self):
# Обработчик команды копирования
widget = self.root.focus_get()
if isinstance(widget, ttk.Entry) or isinstance(widget, tk.Text):
widget.event_generate("<<Copy>>")
def cmd_cut(self):
# Обработчик команды вырезания
widget = self.root.focus_get()
if isinstance(widget, ttk.Entry) or isinstance(widget, tk.Text):
widget.event_generate("<<Cut>>")
def cmd_paste(self):
# Обработчик команды вставки
widget = self.root.focus_get()
if isinstance(widget, ttk.Entry) or isinstance(widget, tk.Text):
widget.event_generate("<<Paste>>")
Ссылка на первоисточник
P.S.: Так же обратите внимание на следующий момент, работает в полях
ttk.Entry
Если же вы используете
tk.Entry - работать не будет.