Сделайте tkinter.Entry только для чтения, но не серым - PullRequest
0 голосов
/ 11 марта 2019

Мне нравится внешний вид виджета записи 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()

Могу ли я изменить стиль записи или мне нужно сделать так, чтобы метка выглядела как запись по умолчанию?

EDIT

Кроме того, возможно ли оставить текст записи доступным для выбора, пока он доступен только для чтения / отключен?

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Кроме того, вы также можете привязать событие к 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()
2 голосов
/ 11 марта 2019

Существует специальная опция для фона и переднего плана, когда запись отключена: 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...