【问题标题】:Python Treeview heading background colour with multiple treeview widgets具有多个树视图小部件的 Python 树视图标题背景颜色
【发布时间】:2021-09-19 09:10:19
【问题描述】:

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

环境:Windows 10 19043.1165 Python 3.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()

【问题讨论】:

    标签: python-3.x tkinter treeview


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这没有帮助。在某个地方,我认为我缺少基础知识。下面是修改后的代码。我注意到注释掉 objStyle.theme_use("clam") 行不会为标题着色。添加它为两个树标题着色
    • 我想通了。使用“蛤”主题为标题添加灰色。所以我用这段代码把“treeview1”的标题改回了白色。 objStyle.configure("treeView1.Treeview.Heading", background="white")
    【解决方案2】:

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

    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()
    

    【讨论】:

      【解决方案3】:

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

      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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多