Tkinter Treeview样式异常:第二个Treeview继承首个样式求助
解决Tkinter中Treeview样式相互继承的问题
问题根源在于ttk的样式是全局生效的——你直接修改了默认的Treeview样式,所有Treeview实例都会自动继承这个样式配置,导致第二个Treeview和第一个样式一致。
要实现两个Treeview的独立样式,你需要为第二个Treeview创建自定义样式类,而不是修改默认的Treeview样式。具体步骤如下:
修改第二个Treeview的代码
为第二个Treeview创建专属的自定义样式(比如命名为Wear.Treeview),并在创建Treeview时指定使用这个样式:
# 创建自定义样式,继承自默认Treeview样式 style_wear = ttk.Style(firsttreeframe) # 配置自定义Treeview的样式 style_wear.configure("Wear.Treeview", font=(None, 12)) # 配置自定义Treeview的表头样式 style_wear.configure("Wear.Treeview.Heading", font=(None, 13)) # 创建Treeview时,通过style参数指定使用自定义样式 tree02 = ttk.Treeview(firsttreeframe, column=("c1", "c2","c3", "c4","c5", "c6","c7", "c8","c9","c10", "c11","c12", "c13","c14", "c15","c16", "c17","c18"), show='headings', height=5, style="Wear.Treeview") # 关键:指定自定义样式 tree02['show']='headings' tree02.grid(row=1,column=0,columnspan=4,sticky=EW)
(可选)优化第一个Treeview的样式
如果你想彻底避免第一个Treeview影响其他组件,也可以为它创建专属的自定义样式:
class tree: def __init__(self): # 创建Treeview时指定自定义样式 self.tree = ttk.Treeview(frametree, height=28, style="Custom.Treeview") self.tree.grid(row=1,column=0,padx=2) self.tree.column("#0",width=250, stretch=NO) self.tree.bind("<ButtonRelease-1>", self.OnClick) self.tree.tag_configure('highlight', background='lightblue') style_def = ttk.Style(frametree) # 配置专属的自定义样式 style_def.configure("Custom.Treeview", background="#FFDEAD", fieldbackground="#FFDEAD", foreground="Black", font=(None, 14), rowheight=30) style_def.configure("Custom.Treeview.Heading", font=(None, 12))
原理说明
ttk的样式系统采用命名空间机制:
- 默认样式(如
Treeview)是全局的,修改后所有同类型组件都会继承 - 自定义样式(如
Wear.Treeview、Custom.Treeview)是独立的,只有指定了style参数的组件会使用该样式 - 自定义样式会自动继承对应基础组件的样式,你只需要修改需要差异化的属性即可
内容的提问来源于stack exchange,提问作者Prashant Priyadarshi
相关产品推荐
相关产品推荐

