Python Tkinter: двойной щелчок для редактирования текста

Я возился с приложением блокнота, используя Tkinter, и я хотел бы, чтобы метка располагалась над основным текстовым полем, чтобы пользователь мог пометить заметку. Я хотел бы иметь возможность дважды щелкнуть метку, чтобы отредактировать ее. Когда пользователь щелкает за пределами текстовой области метки, он сохраняет там текст. Я понимаю, что мог бы сделать простую текстовую область для ввода пользователем, но я также хотел бы, чтобы она была центрирована, а не мигал курсором все время. Я новичок в Tkinter, поэтому, возможно, есть простое решение или лучший подход. Спасибо за любую помощь!

Вы можете использовать обычный виджет Entry с его состоянием, установленным на DISABLED, чтобы не было курсора вставки. Привяжите к событию <Double-Button-1>, чтобы изменить состояние на НОРМАЛЬНОЕ, и к <FocusOut>, чтобы вернуться к ОТКЛЮЧЕННОМУ.

jasonharper 21.03.2022 21:38

Звучит как отличная рекомендация! я попробую

Frogstomp 21.03.2022 21:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать метку, настроенную таким образом, чтобы при двойном щелчке по ней накладывался виджет записи.

Что-то вроде этого, например:

class EditableLabel(tk.Label):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.entry = tk.Entry(self)
        self.bind("<Double-1>", self.edit_start)
        self.entry.bind("<Return>", self.edit_stop)
        self.entry.bind("<FocusOut>", self.edit_stop)
        self.entry.bind("<Escape>", self.edit_cancel)

    def edit_start(self, event=None):
        self.entry.place(relx=.5, rely=.5, relwidth=1.0, relheight=1.0, anchor = "center")
        self.entry.focus_set()

    def edit_stop(self, event=None):
        self.configure(text=self.entry.get())
        self.entry.place_forget()

    def edit_cancel(self, event=None):
        self.entry.delete(0, "end")
        self.entry.place_forget()

Затем вы можете использовать это как обычную метку, как в следующем примере.

root = tk.Tk()
label = EditableLabel(root, text = "double-click to edit me")
text = tk.Text(root)
label.pack(side = "top", fill = "x", padx=2, pady=2)
text.pack(side = "top", fill = "both", expand=True)
root.mainloop()

Работает именно так, как нужно! Большое спасибо!

Frogstomp 22.03.2022 18:10

Другие вопросы по теме