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 的文本分别为蓝色、红色、绿色和青色。但是,我只能看到它们是黑色的。
如前所述,这是 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() 应该按预期工作。
-你在cmd中使用什么版本的python(python -V)
- python 的最新版本(3.7)似乎有颜色标签的错误
-如果您使用的是 python (3.7),只需安装 python 3.6(它也可能适用于较新的版本)
归档时间: |
|
查看次数: |
1861 次 |
最近记录: |