tkinter 似乎已经更改了显示选定文本的默认样式

tkinter seems to have changed its default style for showing selected text

我刚刚重建了我的 linux 桌面,现在是 Mint 20.1 Mate。我有 python 3.8.5 和 Tk 8.6。不幸的是,我不确定我上周使用的是哪个版本的 Tk,我确定它已经使用了很长时间的 8.6,但是我使用的是带有 python 3.8.5 的 Mint 20.1 xcfe。 Tk 是通过 apt install python3-tk

安装的

使用 Tk GUI 的程序,带有 Entry 和 Text 等文本小部件,在过去十年中直到上周,用于显示具有明显对比突出显示的选定文本,仅使用默认设置。我不确定它是否与 Mint 使用的相同,但它并没有引起任何意外。

现在我重建了,选择突出显示或多或少是不可见的。如果我非常仔细地看(非常浅的灰色),我可以看出它已被突出显示,但现在使用起来很痛苦。我可以通过将背景更改为对比鲜明的颜色(如绿色或橙色)来使其更显眼,这在美学上不是很令人满意。

如何重新更改 Tk 的默认值?我怎样才能知道它们应该是什么?它是否具有用户可访问的默认值?

查看文档,我发现除了文本选择高亮显示之外,大部分内容都有更改的选项。

它可能告诉我我应该进步到 ttk 和样式。但这有点需要学习,还有很多程序需要更改。

tkinter 使用它所谓的选项数据库作为其默认值。不同的平台会对这个数据库有不同的定义。可能是您的 OS 更改了它,或者您的特定桌面环境导致了它的更改。

文本选择由 selectbackgroundselectforeground 选项控制。对于每个选项,选项数据库中都有对应的值。每个小部件也有值 class,因此您可以为文本小部件设置一个值,为条目小部件设置不同的值。

对于 selectbackground,选项数据库中的名称是 selectBackground。您可以使用 option_set 方法更改数据库中的值。 设置此值后创建的任何小部件都将使用新值。

例如,如果要将条目选择背景设置为粉红色,您可以这样做:

import tkinter as tk

root = tk.Tk()
root.option_add("*Entry.selectBackground", "pink")

在该行代码之后创建的任何 Entry 小部件都将默认选择粉红色作为选择背景。要为所有小部件更改它,您只需删除 Entry.:

root.option_add("*selectBackground", "pink")

选项数据库有点神秘。它的根源在于当 tk 仅在基于 X11 的系统上工作时指定小部件选项的方式。它非常强大,但不是特别直观。

据我所知,最详细的在线文档是 python 文档中标题为 Options and Tk - A Beginner's Guide. It is written from the perspective of tcl/tk rather than python/tkinter, but the concepts are identical. The Tkinter Life Preserver 的文档,可以帮助翻译成 python。

经过一番搜索,我遇到了这个命令

root.tk_setPalette(background='#40E0D0', foreground='black', etc, ...

它更改了应用程序中所有现有的小部件,并为新的小部件设置了默认值。根据this page可以设置以下选项...

前景/背景
activeForeground / activeBackground
选择前景/选择背景
高亮颜色/高亮背景
禁用前景
插入背景
槽色
选择颜色

其中大部分都符合我的预期。然而 insertBackground 似乎只控制插入光标的颜色,而 selectColor CheckButtons 的背景。 highlightColor 和 highlightBackground 分别控制有焦点和没有焦点的小部件的轮廓。