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

如何解决TKinter TreeView刷新数据库数据时重复添加的问题

解决Tkinter Treeview自动刷新数据库数据重复添加的问题

你的核心问题是每次刷新时没有清空Treeview中已有的旧数据,导致新查询到的记录直接追加到后面,造成重复。以下是修改后的代码,同时优化了部分细节:

from tkinter import ttk
import tkinter as tk
import pyodbc


def refresh_data():
    # 清空Treeview中所有现有条目
    tree.delete(*tree.get_children())
    
    # 连接数据库并查询数据
    con1 = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\craig\UKDN\DB.accdb;')
    cur1 = con1.cursor()
    cur1.execute("select * from Units")
    rows = cur1.fetchall()

    # 插入新数据
    for row in rows:
        print(row)
        tree.insert("", tk.END, values=row)

    con1.close()
    # 定时调用刷新函数,间隔1秒
    root.after(1000, refresh_data)


root = tk.Tk()
tree = ttk.Treeview(root, 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="FNAME")
tree.column("#3", anchor=tk.CENTER)
tree.heading("#3", text="LNAME")
tree.pack()

# 启动自动刷新
refresh_data()
root.mainloop()

关键修改说明:

  • 清空旧数据:tree.delete(*tree.get_children()) 会获取Treeview中所有子项的ID,通过批量删除操作清空所有旧记录,确保每次刷新都是全新的数据。
  • 函数命名优化:把View()改成refresh_data(),更直观体现函数功能。
  • 逻辑保持一致:保留了你原本的after定时调用逻辑,确保每1秒自动刷新一次数据。

可选优化建议(针对新手进阶):

  • 可以把数据库连接信息抽成常量,避免硬编码。
  • 使用上下文管理器(with语句)管理数据库连接和游标,自动处理关闭操作,减少资源泄漏风险:
    with pyodbc.connect(...) as con1:
        with con1.cursor() as cur1:
            cur1.execute("select * from Units")
            rows = cur1.fetchall()
    

内容的提问来源于stack exchange,提问作者Nixfee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:41