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效果图 ---↓
可以发现,两个表格的表头没有跟随风格定义变化!
目前只知道通过以下方法修改,但对所有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效果图 ---↓
给你咨询了一下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小部件修改表头的风格。
参考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]