我喜欢默认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()
我可以更改条目的样式还是应该尝试使Label看起来像默认条目?
编辑
还可以在只读/禁用的同时保持Entry文本为可选状态吗?
答案 0 :(得分:2)
禁用该条目时,背景和前景有一个特殊选项: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')
强制进行验证不容许的编辑时,验证将被禁用(这也是为什么我们需要{{1} },以在开始验证之前主动设置文本)。因此,要更改文本,您需要禁用验证,更新文本并重新启用验证,例如:
entry1.update()
答案 1 :(得分: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()