将背景设置为调色板

时间:2016-05-31 20:23:17

标签: background tcl tk color-scheme

我在使用默认调色板颜色和自定义颜色的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查询给定元素的默认颜色?

1 个答案:

答案 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