ttk.Treeview删除所有项后标签名未销毁?如何批量清除标签配置?
关于ttk.Treeview标签留存的异常现象及疑问
现象复现
在ttk.Treeview中发现如下异常:按顺序点击Populate→TagConfigure→Reset→Populate按钮后,已被销毁的F2和F3项重新生成后仍显示红色。点击Reset按钮后的打印信息确认所有Treeview项已不存在,但标签配置依然生效。
复现该现象的测试代码:
import tkinter as tk from tkinter import ttk class App(ttk.Frame): def __init__(self, parent): super().__init__(parent) self.parent = parent self.top_iids = [] self.child_iids = [] self._create_widget() def _create_widget(self): self.tree = ttk.Treeview( self, height=10, selectmode='extended', takefocus=True,) self.tree.column('#0', stretch=True, width=200, anchor='w') self.tree.heading('#0', text="Col0", anchor='w') self.bn1 = ttk.Button(self, text="Populate", command=self.populate) self.bn2 = ttk.Button(self, text="TagConfigure", command=self.tagconfig) self.bn3 = ttk.Button(self, text="Reset", command=self.reset) self.tree.grid(row=0, column=0, rowspan=4, padx=5, pady=5) self.bn1.grid(row=0, column=1, padx=5, pady=5) self.bn2.grid(row=1, column=1, padx=5, pady=5) self.bn3.grid(row=2, column=1, padx=5, pady=5) def populate(self): counter = 0 for i in range(4): self.tree.tag_configure(i) tliid = f"G{i}" self.tree.insert("", "end", iid=tliid, open=True, tags=[tliid], text=f"Restaurant {i}") ciid = f"F{counter}" self.tree.insert(tliid, "end", iid=ciid, text="Cookie", tags=[ciid], values=(ciid)) self.top_iids.append(tliid) self.child_iids.append(ciid) counter+=1 def tagconfig(self): self.tree.tag_configure('F2', foreground='red') self.tree.tag_configure('F3', foreground='red') def reset(self): print(f"def reset(self):") top_level_nodes = self.tree.get_children() self.tree.delete(*top_level_nodes) tln_exist = {i:self.tree.exists(i) for i in top_level_nodes} chn_exist = {i:self.tree.exists(i) for i in self.child_iids} print(f"{tln_exist=}") print(f"{chn_exist=}") # uncomment to make iids F2 & F3 black at 2nd press of Populate button # self.tree.tag_configure('F2', foreground='') # self.tree.tag_configure('F3', foreground='') if __name__ == '__main__': root = tk.Tk() app = App(root) app.pack(fill="both", expand=True) root.mainloop()
点击Reset按钮后的打印输出:
def reset(self): tln_exist={'G0': False, 'G1': False, 'G2': False, 'G3': False} chn_exist={'F0': False, 'F1': False, 'F2': False, 'F3': False}
临时修复方案
在self.reset()方法中添加以下代码,重置对应标签的前景色配置,可解决该问题:
self.tree.tag_configure('F2', foreground='') self.tree.tag_configure('F3', foreground='')
疑问
根据ttk.Treeview.tag_configure(tagName, option=None, **kw)的文档说明,第一个参数为标签名,由此推测即使所有关联的Treeview项被销毁,F2和F3标签名及其配置仍会保留。基于此有两个疑问:
- 上述理解是否正确?
- 是否存在类似
ttk.Treeview.delete(*items)的方法,可批量销毁旧标签名及其配置?
内容的提问来源于stack exchange,提问作者Sun Bear
相关产品推荐
相关产品推荐

