python:tkinter树视图颜色没有更新

Gon*_*z87 4 treeview tkinter colors python-3.x

这是我的第一篇文章,如果格式有误,请见谅,如果需要,我很乐意更改。

我正在使用 Tkinter 创建一个用于科学数据分析的界面。对于分子列表,可以在单独的图中表示四个。另一方面,我使用 Treeview 显示有关所有分子的一些数字。(不仅仅是显示的)当树视图行与显示的图有关时,我希望该行的文本颜色相同。

对于每个显示的图形,我在代表它的行上放置一个不同的标记,然后使用标记方法将前景色更改为绘图的颜色。

代码过去工作正常,但现在它停止工作而没有对我的代码进行任何更改。使用标签设置前景色不会改变颜色。几行之后,我也使用该方法将一行更改为粗体,并且效果很好。

我设法确认代码行被正确读取:如果我将颜色设置为无法识别的值,则按预期执行时会出现 tkinter 错误。此外,使用一些打印,if/elif 在正确的时刻按预期执行(逻辑测试中没有错误)。

该代码在另一台计算机上运行良好,这让我相信某些 python 包存在问题。两台计算机具有相同的 ttk 版本 (0.3.1),我在注意到问题后更新了所有模块以确保它不是过时的包。

唯一对电脑做的改动就是把anaconda和环境卸载重装了,现在用的环境中增加了pyinstaller的安装(用pip)(我在原环境安装pyinstaller的时候已经修改了其他错误地安装了重要的包,不得不从头开始重新安装 anaconda 才能让它再次工作)

我尝试在没有 pyinstaller 模块的情况下创建另一个相同的环境,但得到了相同的结果。

我已经不知道卸载并重新安装 anaconda 来解决问题的次数了。如果可能的话,我真的不想重新安装它。

我已经隔离了制作树视图对象的界面代码。经过测试,下面的代码片段给了我同样的问题。

import tkinter as tk
from tkinter import ttk
import numpy as np

class Testy():
    def __init__(self, root):

        #Values set in other part of the interface
        self.Classes = ['Molecule1','Molecule2','Molecule3','Molecule4',
                        'Molecule5','Molecule6']
        self.Single_Kinetic_Menu_Var = [tk.StringVar(value = 'Molecule1'), 
                                        tk.StringVar(value = 'Molecule3'),
                                        tk.StringVar(value = 'Molecule4'), 
                                        tk.StringVar(value = 'Molecule5')]
        self.Experiment_Count = np.zeros([len(self.Classes),2])

        #Treeview widget making
        Tree = ttk.Treeview(root)
        Tree.grid(column = 0, row = 0)

        Headings = ('first count','second count')
        Tree['column'] = Headings

        Tree.column("#0", width=100, minwidth=100)
        Tree.heading("#0",text="Class")

        for i in range(len(Headings)) :
            Tree.column(Headings[i])
            Tree.heading(Headings[i], text = Headings[i])

        #Insert all classes and their counts
        Empty = []
        Total = []
        Total = list(Total)
        for Idx, Class in enumerate(self.Classes) :
            Values = []
            if Idx == len(self.Classes)-1 :
                for Number in self.Experiment_Count[Idx,:] :
                    Values.append(str(Number))
                    Empty.append('-')
                    Total.append(0)
            else :
                for Number in self.Experiment_Count[Idx,:] :
                    Values.append(str(Number))
            Values = tuple(Values)

            if Class == self.Single_Kinetic_Menu_Var[0].get() :
                Tree.insert("", Idx, text = Class, values=Values, tags = ('BLUE'))
                Tree.tag_configure('BLUE', foreground = 'blue')
            elif Class == self.Single_Kinetic_Menu_Var[1].get() :
                Tree.insert("", Idx, text = Class, values=Values, tags = ('RED'))
                Tree.tag_configure('RED', foreground = 'red')
            elif Class == self.Single_Kinetic_Menu_Var[2].get() :
                Tree.insert("", Idx, text = Class, values=Values, tags = ('GREEN'))
                Tree.tag_configure('GREEN', foreground = 'green')
            elif Class == self.Single_Kinetic_Menu_Var[3].get() :
                Tree.insert("", Idx, text = Class, values=Values, tags = ('CYAN'))
                Tree.tag_configure('CYAN', foreground = 'cyan')
            else :
                Tree.insert("", Idx, text = Class, values=Values)
        Tree.insert('', len(self.Classes), text = '-', values = tuple(Empty))
        Total = np.sum(self.Experiment_Count[:,:], axis = 0)
        Tree.insert('',len(self.Classes)+1, text = 'TOTAL', values = tuple(Total),
                    tags = ('BOLD'))
        Tree.tag_configure('BOLD', font = ('Calibri', 12, 'bold'))


def main():
    Master = tk.Tk()
    Master.title("interface")


    Testy(Master) 

    Master.mainloop()


if __name__ == '__main__' :
    main()
Run Code Online (Sandbox Code Playgroud)

正如您通过运行代码可能看到的,我希望分子 1、3、4 和 5 的文本分别为蓝色、红色、绿色和青色。但是,我只能看到它们是黑色的。

Gin*_*nic 7

如前所述,这是 tkinter 库 > 8.6.8 的一个已知问题。此版本的 tkinter 预装了较新版本的 Python(> 3.7)。

这里已经提出了一个解决方法:https : //core.tcl-lang.org/tk/tktview?name=509cafafae

定义过滤掉参数的函数

def fixed_map(option):
    # Returns the style map for 'option' with any styles starting with
    # ("!disabled", "!selected", ...) filtered out

    # style.map() returns an empty list for missing options, so this should
    # be future-safe
    return [elm for elm in style.map("Treeview", query_opt=option)
            if elm[:2] != ("!disabled", "!selected")]
Run Code Online (Sandbox Code Playgroud)

使用新函数映射样式

style = ttk.Style()
style.map("Treeview", 
          foreground=fixed_map("foreground"),
          background=fixed_map("background"))
Run Code Online (Sandbox Code Playgroud)

有了这个 tag_configure() 应该按预期工作。


Ali*_*Ali 4

-你在cmd中使用什么版本的python(python -V)

- python 的最新版本(3.7)似乎有颜色标签的错误

-如果您使用的是 python (3.7),只需安装 python 3.6(它也可能适用于较新的版本)

  • 这似乎确实是Python版本的,非常感谢。如果有人有同样的问题,请获取更多信息,该代码在 3.7.1 中运行良好,但我在 3.7.3 版本中遇到问题 (2认同)