Pull to refresh

Почему в CustomTkinter не работают Ctrl+C / Ctrl+V и как это починить

Писал админку на CustomTkinter и наткнулся на классический баг: стандартное контекстное меню (правая кнопка мыши) с «Копировать/Вставить» просто не работает. Точнее, оно появляется, но при нажатии ничего не происходит.

Проблема в том, что CTkEntry наследуется от tkinter, но не обрабатывает системные виртуальные события (<<Copy>>, <<Paste>>) так, как мы привыкли.

Как это выглядит в коде (не работает):

menu.add_command(label="Вставить", command=lambda: entry.event_generate("<<Paste>>"))

Как это реально починить:
Нужно обращаться напрямую к системному буферу обмена (clipboard) через методы самого виджета.

import tkinter as tk

def paste_text(entry_widget):
    try:
        text = entry_widget.clipboard_get()
        if entry_widget.selection_present():
            entry_widget.delete(tk.SEL_FIRST, tk.SEL_LAST)
        entry_widget.insert(tk.INSERT, text)
    except tk.TclError:
        pass

menu.add_command(label="Вставить", command=lambda: paste_text(my_entry))

Для «Копировать» логика похожая: проверяем selection_present(), берем selection_get() и кидаем в clipboard_append().

В итоге меню заработало идеально. Кто еще сталкивался с таким в CTk? Или вы юзаете pyperclip для таких задач?

Tags:
+1
Comments0

Articles