在下面的代码中,该show_widget_validity()
函数要么应用一个自定义样式,该样式只是对小部件现有样式的背景颜色进行了更改,要么恢复原始样式。这是一个库例程,因此不能完全控制样式。背景颜色似乎已正确重新配置,如每次更改后条目小部件中报告的背景样式描述所示。但是,小部件的实际背景颜色不会改变。
这种行为在使用 Python 2.7 和 3.6 的 Linux 以及使用 Python 2.7 的 Windows 上可见;我没有测试过其他环境。
任何有关此行为原因的线索,或解释它所需的代码更改,将不胜感激。
编辑:使用“fieldbackground”而不是“background”在 Linux 上有效,但在 Windows 上无效,并且不允许在禁用状态下修改背景颜色。
try:
import Tkinter as tk
except:
import tkinter as tk
try:
import ttk
except:
from tkinter import ttk
def show_widget_validity(widget, is_valid):
invalid_color = "#fff5ff"
invalid_disabled_color = "#f6f0f6"
sname = widget["style"] or widget.winfo_class()
if sname.startswith("Invalid."):
if is_valid:
widget['style'] = sname[8:]
else:
if not is_valid:
invname = "Invalid." + sname
ttk.Style().configure(invname, background=[('disabled', invalid_disabled_color), ('active', invalid_color)])
# Simpler, but also ineffective:
#ttk.Style().configure(invname, background=invalid_color)
widget['style'] = invname
def show_invalid():
show_widget_validity(entry, False)
entry_var.set(ttk.Style().lookup(entry["style"] or entry.winfo_class(), "background"))
def show_valid():
show_widget_validity(entry, True)
entry_var.set(ttk.Style().lookup(entry["style"] or entry.winfo_class(), "background"))
root = tk.Tk()
root.title("Testing of Style Customization")
appframe = tk.Frame(root, padx=12, pady=12)
appframe.pack(expand=True, fill=tk.BOTH)
entry_var = tk.StringVar()
entry = ttk.Entry(appframe, textvariable=entry_var, width=40, exportselection=False)
entry.grid(row=0, column=0, padx=3, pady=3, sticky=tk.EW)
btnframe = ttk.Frame(appframe)
btnframe.grid(row=1, column=0)
invalid_btn = ttk.Button(btnframe, text="Make invalid", command=show_invalid)
valid_btn = ttk.Button(btnframe, text="Make valid", command=show_valid)
invalid_btn.grid(row=0, column=0, padx=3, pady=3)
valid_btn.grid(row=0, column=1, padx=3, pady=3)
root.mainloop()