Tkinter点击按钮仅显示单次Treeview表格并实现刷新的方法
解决Tkinter Treeview重复创建与内容刷新问题
原代码问题分析
- 每次点击按钮都会新建一个Treeview实例,导致多次点击生成重复表格
- 代码末尾调用
tree.destroy(),刚创建的Treeview被立即销毁,所以点击后无法显示内容
方案1:复用Treeview,清空旧数据后刷新内容
将Treeview实例定义在函数外部(全局或类属性),每次点击时先清空现有数据,再插入新内容:
import tkinter as tk from tkinter import ttk # 自定义客户类,确保能转换为Treeview所需的元组格式 class Vevok: def __init__(self, id, nev, cim): self.id = id self.nev = nev self.cim = cim def __iter__(self): yield self.id yield self.nev yield self.cim window = tk.Tk() window.title("客户数据展示") # 全局存储Treeview实例,初始为None tree = None def Vevok_Listazasa(): global tree # 模拟动态获取的客户数据 Lista = [Vevok("ID_1","Ceg_1","Cim_1"), Vevok("ID_2","Ceg_2","Cim_2"), Vevok("ID_3","Ceg_3","Cim_3")] if tree is None: # 首次点击:创建Treeview并配置列 tree = ttk.Treeview(window, column=("c1","c2","c3"), show='headings') tree.column("#1", anchor=tk.CENTER) tree.heading("#1", text="ID") tree.column("#2", anchor=tk.CENTER) tree.heading("#2", text="客户名称") tree.column("#3", anchor=tk.CENTER) tree.heading("#3", text="公司地址") tree.pack(padx=10, pady=10) else: # 非首次点击:清空现有数据 for item in tree.get_children(): tree.delete(item) # 插入新数据 index = iid = 0 for item in Lista: tree.insert("", index, iid, values=tuple(item)) index = iid = index + 1 # 创建触发按钮 show_btn = ttk.Button(window, text="Show List_1", command=Vevok_Listazasa) show_btn.pack(pady=10) window.mainloop()
方案2:每次销毁旧Treeview,重新创建新实例
如果不想复用实例,可每次点击先销毁已存在的Treeview,再重新创建:
import tkinter as tk from tkinter import ttk class Vevok: def __init__(self, id, nev, cim): self.id = id self.nev = nev self.cim = cim def __iter__(self): yield self.id yield self.nev yield self.cim window = tk.Tk() window.title("客户数据展示") tree = None def Vevok_Listazasa(): global tree Lista = [Vevok("ID_1","Ceg_1","Cim_1"), Vevok("ID_2","Ceg_2","Cim_2"), Vevok("ID_3","Ceg_3","Cim_3")] # 销毁已存在的Treeview if tree is not None: tree.destroy() # 创建新Treeview并配置 tree = ttk.Treeview(window, column=("c1","c2","c3"), show='headings') tree.column("#1", anchor=tk.CENTER) tree.heading("#1", text="ID") tree.column("#2", anchor=tk.CENTER) tree.heading("#2", text="客户名称") tree.column("#3", anchor=tk.CENTER) tree.heading("#3", text="公司地址") # 插入数据 index = iid = 0 for item in Lista: tree.insert("", index, iid, values=tuple(item)) index = iid = index + 1 tree.pack(padx=10, pady=10) show_btn = ttk.Button(window, text="Show List_1", command=Vevok_Listazasa) show_btn.pack(pady=10) window.mainloop()
关键注意点
- 必须将Treeview实例的引用全局化(或作为类的实例属性),才能在多次点击时访问到已创建的实例
tree.get_children()可获取所有子项ID,通过tree.delete(item)逐个清空数据- 自定义
Vevok类需支持转换为元组,要么实现__iter__方法,要么直接传入属性组合(如values=(item.id, item.nev, item.cim))
内容的提问来源于stack exchange,提问作者Péter Kis
相关产品推荐
相关产品推荐

