为何Tkinter Treeview行颜色无法通过标签设置生效?
Tkinter Treeview奇偶行颜色不生效问题(结合CustomTkinter)
我尝试通过标签为Tkinter Treeview设置奇偶行颜色,但按照教程操作后仍未生效。怀疑问题源于同时使用CustomTkinter和Tkinter,且尝试用Style.configure修改外观后,仍无法实现奇偶行分色需求。
相关代码如下:
self.sidebar_button_event() self.ultimo = "Inventario" self.cajas_frame = customtkinter.CTkTabview(self, height=250) self.cajas_frame.add("Cajas") self.cajas_frame.tab("Cajas").grid_columnconfigure(0, weight=1) self.cajas_frame.tab("Cajas").grid_rowconfigure(0, weight=1) self.cajas_frame.grid(row=0, column=1, padx=(20, 20), pady=(20, 20), sticky="new", columnspan=3) self.setTablaCajas() n = 0 for f in self.inventario.datosCajas(): if n % 2 == 0: self.cajas.insert(parent='', index='end', iid=n, values=f, tags=('par',)) else: self.cajas.insert(parent='', index='end', iid=n, values=f, tags=('impar',)) self.cajas.bind("<<TreeviewSelect>>", self.clickCajas) n += 1 n = 0 self.cajas.tag_configure('par', background='orange', ) self.cajas.tag_configure('impar', background='purple')
当前效果:
问题原因
CustomTkinter的主题样式会覆盖Tkinter ttk控件(包括Treeview)的默认样式,直接调用tag_configure设置的背景色会被CustomTkinter的主题优先级压制,导致无法显示。此外,你将<<TreeviewSelect>>绑定放在循环内,会导致重复绑定事件,虽然不影响颜色显示,但会引发不必要的多次回调。
解决方法
- 调整事件绑定位置:将Treeview的点击事件绑定移到循环外部,避免重复绑定。
- 修改ttk样式优先级:通过配置ttk.Style,让Treeview基础样式与标签样式兼容,确保标签的背景色能正常生效。
修改后的代码示例:
self.sidebar_button_event() self.ultimo = "Inventario" self.cajas_frame = customtkinter.CTkTabview(self, height=250) self.cajas_frame.add("Cajas") self.cajas_frame.tab("Cajas").grid_columnconfigure(0, weight=1) self.cajas_frame.tab("Cajas").grid_rowconfigure(0, weight=1) self.cajas_frame.grid(row=0, column=1, padx=(20, 20), pady=(20, 20), sticky="new", columnspan=3) self.setTablaCajas() # 配置Treeview样式,确保标签背景能生效 import tkinter.ttk as ttk style = ttk.Style() # 重置Treeview基础样式,避免被CustomTkinter主题完全覆盖 style.configure("Treeview", background="#ffffff", foreground="#000000") # 保留选中行的样式映射 style.map("Treeview", background=[('selected', '#0078d7')]) n = 0 for f in self.inventario.datosCajas(): if n % 2 == 0: self.cajas.insert(parent='', index='end', iid=n, values=f, tags=('par',)) else: self.cajas.insert(parent='', index='end', iid=n, values=f, tags=('impar',)) n += 1 # 将事件绑定移到循环外 self.cajas.bind("<<TreeviewSelect>>", self.clickCajas) # 配置标签样式 self.cajas.tag_configure('par', background='orange') self.cajas.tag_configure('impar', background='purple')
补充说明
如果上述方法仍不生效,可以尝试将Treeview的style参数指定为自定义样式名,再针对该样式进行配置,进一步提升标签样式的优先级:
# 创建Treeview时指定自定义样式 self.cajas = ttk.Treeview(self.cajas_frame.tab("Cajas"), style="Custom.Treeview") # 配置自定义样式 style.configure("Custom.Treeview", background="#ffffff", foreground="#000000") style.map("Custom.Treeview", background=[('selected', '#0078d7')])
内容的提问来源于stack exchange,提问作者MakiMH3
相关产品推荐
相关产品推荐

