将tkinter.Entry设为只读,但不灰显

时间:2019-03-11 09:38:06

标签: python python-3.x user-interface 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()

我可以更改条目的样式还是应该尝试使Label看起来像默认条目?

编辑

还可以在只读/禁用的同时保持Entry文本为可选状态吗?

2 个答案:

答案 0 :(得分:2)

禁用该条目时,背景和前景有一个特殊选项:disabledbackgrounddisabledforeground。因此,要使禁用的条目看起来更像常规条目,可以使用:

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()