You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:05:21