如何解决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
相关产品推荐
相关产品推荐

