【发布时间】:2019-05-27 18:37:59
【问题描述】:
这是我的第一篇文章,如果我在格式上有错误,请原谅,如果需要,我很乐意更改。
我正在使用 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()
正如您通过运行代码所看到的,我希望分子 1、3、4 和 5 的文本分别为蓝色、红色、绿色和青色。但是,我只能看到它们是黑色的。
【问题讨论】:
-
这段代码给了我你想要的输出,所以这段代码没有问题
-
感谢您的反馈,但这正是我的问题。代码很好,但是有些东西可以阻止彩色显示,因为我只能在我的电脑上看到它是黑色的。我想指出导致此问题的原因,以便制作可以分发并适用于所有人的可靠代码。
-
请问您的 python 版本?
-
Python 3.6.3 |Anaconda 自定义(64 位)| (默认,2017 年 10 月 15 日,03:27:45)[MSC v.1900 64 位 (AMD64)] 在 win32 上
-
@Chetan Vashisth 我的错,从错误的计算机上获取了 python 版本,实际版本是 Python 3.7.3。我相信版本中提到问题的答案和cmets是正确的。
标签: python-3.x tkinter colors treeview