@alekseyizmaylov

Python Tkinter Ctl+V Ctr+C Ctrl+X для поля Text?

Python Tkinter Ctl+V Ctr+C Ctrl+X для поля Text - подскажите пожалуйста как сделать, нужно брать куски текста из приложения из поля Text, в которое выводится результат и вставлять в документы, например в Word
???
  • Вопрос задан
  • 481 просмотр
Пригласить эксперта
Ответы на вопрос 1
PolarOneBear
@PolarOneBear
Проблема в раскладке клавиатуры. Это всё работает (или должно) если раскладка английская. При русской раскладке - буквы другие.

И вроде бы есть решение:
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 - работать не будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы