Создать tkinter.Запись доступна только для чтения, но не выделена серым цветом

#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 .