Python 具有多个树视图小部件的树视图标题背景颜色

Python Treeview heading background colour with multiple treeview widgets

我正在尝试更改其中一个树视图小部件标题的背景颜色。但是,这两个树视图小部件都会发生变化。我希望“Tree2”标题有不同的背景,而“Tree1”没有任何颜色。我究竟做错了什么? 下面是我的代码。

环境:Windows10 19043.1165Python3.9.6

import tkinter as objTK
from tkinter import ttk as objTTK

# Create window
objWindow = objTK.Tk()

# Initialise variables
arrHdr = ["Hdr1", "Hdr2"]
arrData = ["Test1", "Test2"]

# ------------ Treeview 1
fFrame1 = objTK.LabelFrame(objWindow, text="Tree 1")
treeView1 = objTTK.Treeview(columns=arrHdr, show="headings")

treeView1.grid(column=0, row=0, sticky="nsew", in_=fFrame1)
fFrame1.grid_columnconfigure(0, weight=1)
fFrame1.grid_rowconfigure(0, weight=1)

treeView1.heading(0, text="Hd1")
treeView1.heading(1, text="Hd2")

treeView1.insert("", "end", values=arrData)

fFrame1.pack()

# ------------ Treeview 2
fFrame2 = objTK.LabelFrame(objWindow, text="Tree 2")
treeView2 = objTTK.Treeview(columns=arrHdr, show="headings")

objStyle = objTTK.Style(treeView2)
objStyle.theme_use("clam")
objStyle.configure("Treeview.Heading", background="#c3c3c3")

treeView2.grid(column=0, row=0, sticky="nsew", in_=fFrame2)
fFrame2.grid_columnconfigure(0, weight=1)
fFrame2.grid_rowconfigure(0, weight=1)

treeView2.heading(0, text="Hd1")
treeView2.heading(1, text="Hd2")

treeView2.insert("", "end", values=arrData)

fFrame2.pack()

objWindow.bind("<Escape>", lambda wExit: objWindow.destroy())

objWindow.mainloop()

您需要在样式名称前添加前缀“Treeview.Heading”才能创建自定义样式,否则适用于所有Treeview:

objStyle.configure("my.Treeview.Heading", background="#c3c3c3")

然后将此自定义样式应用到 treeView2:

treeView2 = objTTK.Treeview(columns=arrHdr, show="headings", style="my.Treeview")

修改代码。添加此作为答案,因为它不允许在评论中添加代码。

import tkinter as objTK
from tkinter import ttk as objTTK

# Create window
objWindow = objTK.Tk()

# Initialise variables
arrHdr = ["Hdr1", "Hdr2"]
arrData = ["Test1", "Test2"]

# ------------ Treeview 1
fFrame1 = objTK.LabelFrame(objWindow, text="Tree 1")
treeView1 = objTTK.Treeview(columns=arrHdr, show="headings")

treeView1.grid(column=0, row=0, sticky="nsew", in_=fFrame1)
fFrame1.grid_columnconfigure(0, weight=1)
fFrame1.grid_rowconfigure(0, weight=1)

treeView1.heading(0, text="Hd1")
treeView1.heading(1, text="Hd2")

treeView1.insert("", "end", values=arrData)

fFrame1.pack()

# ------------ Treeview 2
fFrame2 = objTK.LabelFrame(objWindow, text="Tree 2")

objStyle = objTTK.Style()
#objStyle.theme_use("clam")
objStyle.configure("my.Treeview.Heading", background="#c3c3c3")

treeView2 = objTTK.Treeview(columns=arrHdr, show="headings", style="my.Treeview")

treeView2.grid(column=0, row=0, sticky="nsew", in_=fFrame2)
fFrame2.grid_columnconfigure(0, weight=1)
fFrame2.grid_rowconfigure(0, weight=1)

treeView2.heading(0, text="Hd1")
treeView2.heading(1, text="Hd2")

treeView2.insert("", "end", values=arrData)

fFrame2.pack()

objWindow.bind("<Escape>", lambda wExit: objWindow.destroy())

objWindow.mainloop()

这是修改后的有效代码。基本上,主题“clam”为标题行添加了灰色。所以我不得不在第一个树视图中添加“白色”颜色,如下面的代码所示。

import tkinter as objTK
from tkinter import ttk as objTTK

# Create window
objWindow = objTK.Tk()

# Initialise variables
arrHdr = ["Hdr1", "Hdr2"]
arrData = ["Test1", "Test2"]

# ------------ Treeview 1

objStyle = objTTK.Style()
objStyle.theme_use("clam")
objStyle.configure("treeView1.Treeview.Heading", background="white")

fFrame1 = objTK.LabelFrame(objWindow, text="Tree 1")
treeView1 = objTTK.Treeview(columns=arrHdr, show="headings", style="treeView1.Treeview")

treeView1.grid(column=0, row=0, sticky="nsew", in_=fFrame1)
fFrame1.grid_columnconfigure(0, weight=1)
fFrame1.grid_rowconfigure(0, weight=1)

treeView1.heading(0, text="Hd1")
treeView1.heading(1, text="Hd2")

treeView1.insert("", "end", values=arrData)

fFrame1.pack()

# ------------ Treeview 2
fFrame2 = objTK.LabelFrame(objWindow, text="Tree 2")

#objStyle.configure("treeView2.Treeview.Heading", background="#c3c3c3")

treeView2 = objTTK.Treeview(columns=arrHdr, show="headings")

treeView2.grid(column=0, row=0, sticky="nsew", in_=fFrame2)
fFrame2.grid_columnconfigure(0, weight=1)
fFrame2.grid_rowconfigure(0, weight=1)

treeView2.heading(0, text="Hd1")
treeView2.heading(1, text="Hd2")

treeView2.insert("", "end", values=arrData)

fFrame2.pack()

objWindow.bind("<Escape>", lambda wExit: objWindow.destroy())

objWindow.mainloop()