首页 > 解决方案 > 使 tkinter.Entry 只读但不灰显

问题描述

我喜欢默认 tkinter entry-widget 的外观,但我想让它成为只读而不是灰显。

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

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

编辑

此外,是否可以在只读/禁用时保持条目的文本可选?

标签: pythonpython-3.xuser-interfacetkinter

解决方案


当条目被禁用时,背景和前景有一个特殊选项: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')例如,通过使用验证将被禁用(这也是我们需要entry1.update()在开始验证之前主动设置文本的原因)。因此,要更改文本,您需要禁用验证,更新文本并重新启用验证,例如:

entry1.configure(validate="none")
entry1_var.set("text")
entry1.configure(validate="key")

推荐阅读