#python #python-3.x #user-interface #tkinter
#python #python-3.x #пользовательский интерфейс #tkinter
Вопрос:
Мне нравится внешний вид виджета записи tkinter по умолчанию, но я хочу сделать его доступным только для чтения, не выделяя его серым цветом.
import tkinter as tk
root = tk.Tk()
entry1_var = tk.StringVar(root, value='Entry1')
entry1 = tk.Entry(root, textvariable=entry1_var)
entry1.configure(state='disabled')
#entry1.configure(background="white") does nothing
entry1.grid()
root.mainloop()
Могу ли я изменить стиль записи или мне следует попробовать сделать метку похожей на запись по умолчанию?
Редактировать
Кроме того, возможно ли сохранить текст записи выбираемым, будучи доступным только для чтения / отключенным?
Ответ №1:
Существует специальная опция для фона и переднего плана, когда запись отключена: disabledbackground
и disabledforeground
. Итак, чтобы отключенная запись больше походила на обычную запись, вы можете использовать:
entry1.configure(disabledbackground="white", disabledforeground="black")
Чтобы по-прежнему иметь возможность выделять текст, вы могли бы использовать другую стратегию. Вместо того, чтобы устанавливать состояние на отключенное, используйте validatecommand
, чтобы запретить все изменения:
import tkinter as tk
def validate():
return False
root = tk.Tk()
vcmd = (root.register(validate))
entry1_var = tk.StringVar(root, value='Entry1')
entry1 = tk.Entry(root, textvariable=entry1_var, validatecommand=vcmd)
entry1.update()
entry1.configure(validate="key")
entry1.grid()
root.mainloop()
Единственное, что следует отметить, это то, что когда вы принудительно редактируете, что не должно быть разрешено проверкой, например, с помощью entry1_var.set('text')
, проверка отключается (это также причина, по которой нам нужно entry1.update()
активно устанавливать текст перед началом проверки). Итак, чтобы изменить текст, вам нужно отключить проверку, обновить текст и повторно включить проверку, например:
entry1.configure(validate="none")
entry1_var.set("text")
entry1.configure(validate="key")
Ответ №2:
В качестве альтернативы вы также можете привязать событие к break
для всех ключей. Вы по-прежнему сможете выделять текст мышью.
import tkinter as tk
root = tk.Tk()
entry = tk.Entry(root)
entry.insert(0,"This is a test")
entry.pack()
def disable_entry(event):
if event.state == 12 and (event.keysym == 'c' or event.keysym == "a"):
return
else:
return "break"
entry.bind("<Key>", disable_entry)
entry.bind("<Button-2>", disable_entry)
root.mainloop()
Комментарии:
1. Это приятно, потому что это просто, но я думаю, что у этого есть некоторые недостатки. Использование кнопки мыши middel при выделении текста копирует текст (может быть исправлено также привязкой
disable_entry
к<Button-2>
), и такие вещи, как Ctrl-A и клавиши со стрелками, больше не работают.2. Согласен — я слегка отредактировал его, чтобы включить
ctrl c
иctrl a
.