我在使用默认调色板颜色和自定义颜色的Tcl / Tk时遇到了问题。
我有一个文本窗格,我想在特定情况下设置背景颜色(例如,指示缺少用户输入),然后回退到默认背景颜色(一旦特定情况已经解决)。
到目前为止,我一直在使用-background
选项来构建小部件。
E.g。
$ wish
# ALERT: turn the background to pink
. configure -background pink
# SNAFU: turn the background back to white
. configure -background white
但是,我刚刚发现tk_setPalette
,它允许我设置应用程序的全局调色板。
不幸的是,两者似乎没有很好地融合在一起:一旦我明确地设置了一个小部件的背景颜色,似乎没有办法取消它(并回归到默认颜色)目前由调色板设置):
$ wish
# cheesy color-scheme
tk_setPalette brown
# ALERT: turn the background to pink
. configure -background pink
# SNAFU: turn the background back to "normal"
. configure -background white
# hmpf, no not "white"; the current palette is 'brown'
. configure -background brown
一个解决方案(我想避免)是将调色板存储在变量中,并使用它来明确设置背景:
$ wish
# cheesy color-scheme
set mypalette brown
tk_setPalette $mypalette
# ALERT: turn the background to pink
. configure -background pink
# SNAFU: turn the background back to "normal"
. configure -background $mypalette
然而,这有各种缺点:
- 我需要跟踪我的应用程序中发生的任何调色板更改(这可能很难做到,因为我的应用程序有一个"插件"可用于蒙皮的系统)
- 这仅适用于background
,但设置颜色调色板会更改颜色而不仅仅是背景。
ESP。第二个缺点是一个真正的问题。
目前,我的其中一个小部件是文字entry
,其中white
为默认背景,pink
为警示颜色和default
文字颜色。
每当我将颜色方案更改为white
以外的任何内容时,默认文本颜色将变为white
,从而使文本不可见(因为背景为white
,而不是{ {1}})。
所以问题是:
如何将颜色恢复为default
提供的默认值?
如何从palette
查询给定元素的默认颜色?
答案 0 :(得分:0)
我认为不再支持tk_setPalette了。它被使用了 与pre-ttk小部件结合使用,并不适用于所有小部件 主题。
查询默认颜色:
获取ttk小部件的背景颜色:
set bg [ttk::style lookup TFrame -background]
其中TFrame是小部件的“类”。
获取pre-ttk小部件的背景颜色:
set bg [. cget -background]
此方法几乎适用于任何pre-ttk小部件。
至于跟踪颜色变化,我会保存任何调色板基色, 背景,fieldbackground,前景和您可能需要的其他颜色 主题插件已加载。
您的另一个选择是保存单个小部件的当前前景/背景等。 在修改它以进行错误显示之前。
set oldbg [.myentry cget -background]
set oldfg [.myentry cget -foreground]
... change colors, display error condition...
... when error is resolved ...
.myentry configure -background $oldbg
.myentry configure -foreground $oldfg
参考文献:ttk::style frame tk_setPalette