在以下代码中,该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'] …Run Code Online (Sandbox Code Playgroud)