【问题标题】:Tkinter ttk: background/foregound color will not work on my computerTkinter ttk:背景/前景色在我的电脑上不起作用
【发布时间】:2019-06-16 05:19:56
【问题描述】:

如果我在 Windows 10 和 7 上通过 IDLE 或 pycharm 中的虚拟环境运行此代码:

import tkinter as tk
from tkinter import ttk

x = tk.Tk()
y = ttk.Treeview(x)
y.insert('',0,values=['red', 'blue'], tags= ('even',))
y['columns'] = ('color1','color2')
for item in y['columns']:
    y.heading(item, text=item)
y.tag_configure('even',foreground='yellow',font=('',25))
y.pack()
x.mainloop()

它改变字体但不改变背景颜色。此代码在从 https://repl.it/languages/tkinter 运行时确实有效,另一位用户指出他已成功从 jupyter notebook 运行它。 tkinter/tcl 版本与我两台计算机上的版本相同。但是,我仍然得到了简单的默认设置。

这在所有 ttk 小部件(例如组合框)中似乎也是一致的。

我已经尝试了每个主题,并在 tcl 代码中搞乱了映射。非常困惑为什么我会遇到这个问题。这里有人遇到过吗?可能是时候切换到 pyQT 了。

【问题讨论】:

    标签: python tkinter tcl ttk


    【解决方案1】:

    Windows 上的默认主题在本机运行时(可能是 winnativexpnativevista)对于大多数 ttk 小部件(尤其包括树视图)不允许您更改背景颜色。其他主题(例如,altclassicclam)可让您更改该方面(或者他们不会忽略它);由主题决定是否忽略您的设置,原生主题优先遵循平台 GUI 设计指南,而不是您提供的指令。

    另请参阅此问题: How do I change the overall theme of a tkinter application?

    请注意,其他平台可能有更严格的主题; OSX 上的aqua 主题定义特别严格。 (虽然改变主题并不足以让应用程序感觉是原生的;不同的平台也喜欢使用不同的小部件进行某些操作,并且有不同的方式来布置它们的 GUI。此外,GUI 的某些方面完全不同。跨平台的 GUI 创建仍然很困难。 )

    【讨论】:

    • 感谢您的评论,我已阅读有关 mac 问题的信息。但是这个问题在 ttk 的每一个主题中都存在。不幸的是,我已经尝试了每个主题。
    【解决方案2】:

    首先,您应该说明您的计算机正在运行什么操作系统。其次,很多 Python GUI 框架不能完全在 Mac OS 上工作(如果那是你的 OS 类型)。例如,对于许多 Python GUI 框架/工具包,Mac OS 倾向于阻止 GUI 为打开的窗口提供非标准背景颜色的能力。我知道大多数 Python GUI 在 Windows 操作系统上都能完美运行,但我不确定它们在 Linux 上的工作方式,但我很确定它们与 Mac OS 有类似的问题,因为它们都是基于 unix 的(我在这里可能是错的,但我不记得了,如果我错了,请纠正我)。 尝试查找 tkinter 的文档,看看他们对您的特定操作系统有什么注意事项。

    另外,我注意到您想要更改背景颜色,但我只看到一个前景标记。您拥有的前景标签只是更改字体颜色,但如果将其更改为背景,它确实会将背景更改为黄色。

    【讨论】:

    • 很好的一点是将我的操作系统编辑到问题中。谢谢。
    • 忽略我最后的评论,我没有看到你已经尝试在 PyCharm 上运行它。
    【解决方案3】:

    上一个问题的用户在删除答案之前发布了此链接: https://core.tcl-lang.org/tk/tktview/509cafafae48cba46796e12d0503a335f0dcfe0b

    这使我朝着正确的方向前进。修复方法是从 tcl 主题源代码中删除一些代码。它位于 tcl/ttk 下的 pythons 文件夹中。打开麻烦主题(ex.clam,winnative),找到这段代码:

    ttk::style map Treeview \
            -background [list disabled $colors(-frame)\
                    {!disabled !selected} $colors(-window) \
                    selected $colors(-selectbg)] \
            -foreground [list disabled $colors(-disabledfg) \
                    {!disabled !selected} black \
                    selected $colors(-selectfg)]
    

    {!disabled !selected} $colors(-window) \{!disabled !selected} black \ 需要删除。 cjmcdonald 在 tcl-lang 论坛上发现了这个。你应该最终得到:

    ttk::style configure Treeview -background $colors(-window)
        ttk::style map Treeview \
            -background [list disabled $colors(-frame)\
                    selected $colors(-selectbg)] \
            -foreground [list disabled $colors(-disabledfg) \
                    selected $colors(-selectfg)]
    

    我能够让它工作的唯一方法是直接从源代码中删除。我相信这里有人可以将其简化为python。

    这只是对 Treeview 小部件而非其他小部件的修复。

    【讨论】:

      猜你喜欢
      • 2014-07-03
      • 2011-04-30
      • 2019-06-25
      • 2022-09-24
      • 2014-07-08
      • 2013-07-12
      • 2018-08-19
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多