Я хочу сделать в Tkinter так, чтобы в текстовом поле, куда выводится сообщение, нельзя было ничего редактировать
Я нашёл эту команду, но я не понимаю как она работает. Если объясните, заранее спасибо
txt.bind("<Key>", lambda a: "break")
Ответы (2 шт):
У вас довольно неоднозначный вопрос. В заголовке вы хотите одно, а в содержании другое. Так или иначе я отвечу на оба вопроса. Чтобы в текстовое поле нельзя было вводить символы, вам его нужно просто заблокировать вот этой командой, но только после того, как вы уже вывели сообщение:
txt.config(state = DISABLED)
А команда:
txt.bind("<Key>", lambda a: "break")
Превращает ваше текстовое поле в своеобразную кнопку. При нажатии какой - либо клавиши выполняется команда. Вообще, вам лучше прочитать документацию к Tkinter на этом сайте здесь вы узнаете много нового о Tkinter.
В данном случае вы к события нажатия на любую клавишу привязываете обработчик, который всегда возвращает строку "break", и таким образом запрещает передавать событие другим обработчикам (в том числе стандартному, который вставляет набранный текст в текстовое поле):
An easier solution is to prevent Tkinter from propagating the event to other handlers; just return the string “break” from your event handler:
def ignore(event): return "break" text.bind("<Return>", ignore)or
text.bind("<Return>", lambda e: "break")
Более очевидный способ просто блокировать текстовое поле - через свойство state либо при создании:
txt = Entry(root, state='disabled')
Либо уже после создания:
txt.config(state='disabled') # или txt['state'] = 'disabled'
Вообще, свойство state есть не только у текстовых полей, но и у других элементов управления, например у кнопок - у них состояние 'disabled' блокирует возможность нажатия на кнопку.
См. The Tkinter Entry Widget, The Tkinter Text Widget
Блокировку события через возврат "break" лучше использовать для более сложных случаев. Так можно блокировать событие по какому-то условию, например можно блокировать ввод любых символов кроме цифр:
# Возвращать None, если нажата цифра (событие не блокируется), иначе возвращать "break" (событие блокируется)
txt.bind("<Key>", lambda event: None if event.char.isnumeric() else "break")