请问各位知道如何只对单个Treeview修改表头的风格吗!?

Python tkinter ttk 的 组件风格问题

目前已知ttk的组件可以通过以下方法定义修改:

--- 代码1 ---↓

import tkinter as tk
import tkinter.ttk as ttk

class my_class:
    
    def __init__(self) -> None:
        
        self.wins = tk.Tk()
        self.wins.geometry("400x400")
        self.style = ttk.Style()
        self.style.configure("my_style_1.Treeview", font=("Arial", 12))
        self.style.configure("my_style_2.Treeview", font=("Arial", 18))
        
        self.treeview_1 = ttk.Treeview(self.wins, columns=["column_1"], show="tree headings", style="my_style_1.Treeview")
        self.treeview_1.place(relx=0, relwidth=1, rely=0, relheight=0.5)
        self.treeview_1.heading("#0", text="#0 column")
        self.treeview_1.heading("column_1", text="column_1")
        self.treeview_1.column("#0", anchor="center")
        self.treeview_1.column("column_1", anchor="center")
        self.treeview_1.insert("", "end", text="示例", values=["示例文本"])
        self.treeview_2 = ttk.Treeview(self.wins, columns=["column_1"], show="tree headings", style="my_style_2.Treeview")
        self.treeview_2.place(relx=0, relwidth=1, rely=0.5, relheight=0.5)
        self.treeview_2.heading("#0", text="#0 column")
        self.treeview_2.heading("column_1", text="column_1")
        self.treeview_2.insert("", "end", text="示例", values=["示例文本"])
        self.treeview_2.column("#0", anchor="center")
        self.treeview_2.column("column_1", anchor="center")
        pass
    
    pass

if __name__ == "__main__":
    my_object = my_class()
    my_object.wins.mainloop()
    pass

--- 代码1效果图 ---↓

img

可以发现,两个表格的表头没有跟随风格定义变化!
目前只知道通过以下方法修改,但对所有Treeview的表头都生效的,请问各位知道如何只对单个Treeview修改表头的风格吗!?

--- 代码2 ---↓

import tkinter as tk
import tkinter.ttk as ttk

class my_class:
    
    def __init__(self) -> None:
        
        self.wins = tk.Tk()
        self.wins.geometry("400x400")
        self.style = ttk.Style()
        self.style.configure("my_style_1.Treeview", font=("Arial", 12))
        self.style.configure("my_style_2.Treeview", font=("Arial", 18))
        
        # new ↓
        self.style.configure("Treeview.Heading", font=("Arial", 16))
        # new ↑
        
        self.treeview_1 = ttk.Treeview(self.wins, columns=["column_1"], show="tree headings", style="my_style_1.Treeview")
        self.treeview_1.place(relx=0, relwidth=1, rely=0, relheight=0.5)
        self.treeview_1.heading("#0", text="#0 column")
        self.treeview_1.heading("column_1", text="column_1")
        self.treeview_1.column("#0", anchor="center")
        self.treeview_1.column("column_1", anchor="center")
        self.treeview_1.insert("", "end", text="示例", values=["示例文本"])
        self.treeview_2 = ttk.Treeview(self.wins, columns=["column_1"], show="tree headings", style="my_style_2.Treeview")
        self.treeview_2.place(relx=0, relwidth=1, rely=0.5, relheight=0.5)
        self.treeview_2.heading("#0", text="#0 column")
        self.treeview_2.heading("column_1", text="column_1")
        self.treeview_2.insert("", "end", text="示例", values=["示例文本"])
        self.treeview_2.column("#0", anchor="center")
        self.treeview_2.column("column_1", anchor="center")
        pass
    
    pass

if __name__ == "__main__":
    my_object = my_class()
    my_object.wins.mainloop()
    pass

--- 代码2效果图 ---↓

img

The End

给你咨询了一下gpt,我看了一下,感觉应该是创建组件的方式不太一样,你看下是否对你有帮助。

要仅对单个Treeview小部件修改表头的风格,您可以使用Treeview的heading方法来设置表头的样式。以下是一个示例代码,演示如何修改单个Treeview的表头样式:

import tkinter as tk
from tkinter import ttk

# 创建窗口
window = tk.Tk()

# 创建Treeview小部件
tree = ttk.Treeview(window)
tree.pack()

# 添加列
tree["columns"] = ("column1", "column2")

# 设置列宽度
tree.column("#0", width=100)
tree.column("column1", width=150)
tree.column("column2", width=200)

# 设置表头文本
tree.heading("#0", text="ID")
tree.heading("column1", text="Name")
tree.heading("column2", text="Email")

# 设置表头样式
tree.heading("#0", anchor="w", command=lambda: print("Clicked ID"))
tree.heading("column1", anchor="w", command=lambda: print("Clicked Name"))
tree.heading("column2", anchor="w", command=lambda: print("Clicked Email"))

# 运行窗口主循环
window.mainloop()

在这个示例中,我们创建了一个带有三列的Treeview小部件,并使用heading方法为每列设置了文本和样式。您可以根据需要调整列的数量、宽度和样式。

请注意,上述示例代码中的样式设置使用了command参数指定了一个回调函数。您可以将其替换为您自己的逻辑代码,以实现在单击表头时执行特定操作的功能。

通过使用Treeview的heading方法,您可以只针对单个Treeview小部件修改表头的风格。

  • 这篇博客: python ttk Treeview的插入、清空、各种点击事件、获取条目值、标题单击排序中的 清空方法: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 参考stackoverflow的提问https://stackoverflow.com/questions/32511843/delete-and-edit-items-in-treeview-tkinter

    代码是对上面的代码添加的

    import tkinter
    from tkinter import ttk  # 导入内部包
    
    li = ['王记','12','男']
    root = tkinter.Tk()
    root.title('测试')
    tree = ttk.Treeview(root,columns=['1','2','3'],show='headings')
    tree.column('1',width=100,anchor='center')
    tree.column('2',width=100,anchor='center')
    tree.column('3',width=100,anchor='center')
    tree.heading('1',text='姓名')
    tree.heading('2',text='学号')
    tree.heading('3',text='性别')
    tree.insert('','end',values=li)
    tree.grid()
    
    def delButton(tree):
        x=tree.get_children()
        for item in x:
            tree.delete(item)
    
    delButton(tree)
    
    root.mainloop()

    (同样是为了省事……这个就是我在博客园的那个提问的回答)

     

    另一种方法:来自很有用但是杂的链接:https://www.cnblogs.com/wumac/p/5816764.html

     

    items = your_treeview.get_children()
    
    [your_treeview.delete(item) for item in items]