Tkinter Treeview追加数据到JSON仅保留最后一条如何解决
你遇到的问题本质是写入逻辑错误:每次新增时仅将当前新增的单条数据写入JSON,未读取已存储的历史数据,新内容直接覆盖了整个文件,导致只能保留最新一条记录。
解决方案
核心实现逻辑
每次写入时遵循「读全量现有数据→更新数据→全量写回文件」的流程,不要直接写入单条数据,也不要用文件追加模式操作JSON文件(会破坏JSON结构导致无法解析)。
分步实现代码
首先定义公共配置和加载函数,在程序启动时调用将历史数据加载到Treeview中:
import json import os # 配置文件存储路径,可自行修改 WEAPON_CONFIG_PATH = "weapon_rec_config.json" def load_local_config(treeview_obj): """加载本地JSON配置到Treeview组件""" # 清空Treeview现有内容避免重复 for item in treeview_obj.get_children(): treeview_obj.delete(item) # 配置文件不存在则初始化空配置 if not os.path.exists(WEAPON_CONFIG_PATH): with open(WEAPON_CONFIG_PATH, "w", encoding="utf-8") as f: json.dump([], f, ensure_ascii=False, indent=2) return # 读取历史配置加载到界面 with open(WEAPON_CONFIG_PATH, "r", encoding="utf-8") as f: try: config_list = json.load(f) except json.JSONDecodeError: # 配置文件损坏时重置为空 config_list = [] for config in config_list: treeview_obj.insert("", "end", values=( config["Game"], config["Weapon"], config["Down"], config["Up"], config["Left"], config["Right"] ))
然后修改你的addWeapon新增函数:
def addWeapon(treeview_obj, game, weapon, down, up, left, right): # 第一步:将新增数据插入Treeview treeview_obj.insert("", "end", values=(game, weapon, down, up, left, right)) # 第二步:读取Treeview所有当前已有的全量配置 all_config = [] for item in treeview_obj.get_children(): row = treeview_obj.item(item, "values") all_config.append({ "Game": row[0], "Weapon": row[1], "Down": row[2], "Up": row[3], "Left": row[4], "Right": row[5] }) # 第三步:全量写入JSON文件覆盖旧内容,此时保存的就是所有最新数据 with open(WEAPON_CONFIG_PATH, "w", encoding="utf-8") as f: json.dump(all_config, f, ensure_ascii=False, indent=2)
额外说明
- 程序初始化时调用一次
load_local_config(你的Treeview实例对象),即可将之前保存的所有配置加载到界面 - 如果后续需要支持配置的修改、删除功能,直接复用上面的全量写入逻辑即可:每次修改Treeview内容后,将Treeview所有数据统一写回JSON,不需要单独处理增删改的不同写入逻辑,还能保证界面和本地存储完全一致
内容的提问来源于stack exchange,提问作者RuthIsRoot
相关产品推荐
相关产品推荐

