在 Tcl/Tk 中定义新颜色(或重新定义现有颜色)

define a new color in Tcl/Tk (or redefine an existing one)

我想做的是在为 canvas 元素着色时使用我自己的自定义颜色名称,这样我就可以创建自己的 palettes/color 方案/...以便在canvas。 我想实现类似于我们可以使用 hightlightColors/... 为常规小部件所做的事情,但具有不同的类别。

现在,我可以像这样使用 named colors

canvas .canvas
pack .canvas
.canvas create rectangle 10 10 100 100 -fill blue

然而,有时我想使用 mauve,但那还不存在:

% .canvas create rectangle 10 10 100 100 -fill mauve
unknown color name "mauve"

使用 tk_setPalette 对我没有帮助:

% tk_setPalette mauve #ae7181
must specify a background color

当然我可以只使用变量:

% set mauve #ae7181
% .canvas create rectangle 10 10 100 100 -fill $mauve

...但是在我的用例中这很快变得丑陋(其中 Tcl/Tk-code 是由另一个应用程序生成的 - 我们真的不想深入了解何时转义 $ 什么时候不...)

所以:是否可以在 Tcl/Tk 中定义我自己的颜色?

当我们在做的时候:是否可以重新定义现有的符号颜色? (例如将 red 变成 #ff5632

应该在 Linux/Windows/macOS 上工作(最好是 Tcl/Tk>=8.4)

命名颜色集由 Xserver(如果您正在使用 Xserver)或在编译时定义为固定列表(在其他平台上)。已经有人提议像我们对字体那样自定义命名颜色,但其中 none 已经完成了任何实施工作;至少在一种情况下,有人认为完成提案足以让其他人为他实施一些东西。 (世界不是这样运作的!)

如果您不需要运行时重新配置命名颜色,最简单的做法是将您想要的颜色(可能是 #ABCDEF 形式)放入全局变量中,然后使用该变量:

# Defining a colour
set IMPORTANT_COLOR "#FF9090"

# Using that colour
button -text "Important!" -background $::IMPORTANT_COLOR

另一种允许更多运行时重新配置的方法是使用自定义 Ttk 主题,但编程主题既非常棘手(它很微妙),又在我从未掌握的 Tk 方面列表中。