JSON文件所有按钮score被批量更新,如何实现单按钮score更新?
如何仅更新被点击按钮对应的score值?
看了你的代码,问题很明确:当前的add_score函数会遍历streak_zone下的所有子控件,并且对每个控件都执行一次JSON更新操作——这就导致不管你点哪个按钮,所有按钮对应的score都会被加1。而且反复打开/关闭JSON文件也有点冗余,我们可以简单修复这个问题:
核心思路
- 利用点击事件传入的
obj参数:这个参数就是被点击的按钮本身,直接从它身上拿text就能定位到JSON里的对应键,完全不需要遍历所有按钮。 - 优化文件操作:只读写JSON文件一次,避免多次打开关闭的额外开销。
修改后的代码
import json # 确保你已经导入了json模块 def add_score(self, obj): # 直接获取被点击按钮对应的JSON键名 target_key = obj.text # 一次性完成文件读写操作 with open("streak.json", "r+") as f: data = json.load(f) # 先检查键是否存在,避免报错 if target_key in data: data[target_key]['score'] += 1 # 把文件指针移到开头,准备写入更新后的数据 f.seek(0) json.dump(data, f, indent=4) # 截断文件,防止旧数据残留(比如原来的内容比新内容长的情况) f.truncate()
为什么这样改?
- 去掉多余的循环:原来的代码遍历所有子控件,相当于每次点击按钮都要把所有按钮的score都更新一遍——这正是你遇到的问题。现在直接用
obj拿到被点击的按钮,一步定位到目标键。 - 合并文件IO:原来的代码在循环里反复打开关闭JSON文件,不仅效率低,还可能引发文件访问冲突。现在用
r+模式打开一次,完成读、改、写全流程,更高效也更安全。 - 增加容错判断:加上
target_key in data的检查,防止按钮文本在JSON中不存在时抛出KeyError,让代码更健壮。
这样修改后,点击哪个按钮,就只会更新JSON中对应键的score值,其他按钮的数据完全不受影响。
内容的提问来源于stack exchange,提问作者yemi.JUMP
相关产品推荐
相关产品推荐

