点击复选框时如何避免score_home列表重复追加数据?
问题解决:Tkinter复选框触发函数时重复追加列表数据
问题分析
每次点击复选框触发func_previous_results时,你直接在已有Info_Match实例的score_home列表上调用append(),但未重置存储数据的结构。这导致每次查询数据库后,所有结果都会被再次追加到列表中,产生重复数据。而你尝试的try/except去重逻辑错误地删除了合法的重复元素(比如列表中的两个1),不符合需求。
解决方案
核心思路:每次触发函数时,完全重置数据存储结构,从数据库重新查询并构建单份正确结果,避免在历史数据基础上追加。
具体修改方案
方案1:完全重置存储字典(推荐)
在func_previous_results函数开头清空test字典,确保每次触发都从全新状态开始构建数据:
def func_previous_results(): # 每次触发时重置字典,彻底清除历史数据 global test test = {} # 执行sqlite3数据库查询逻辑 # ...(省略你的数据库连接、查询代码) # 处理查询结果 for row in previous_results_query.fetchall(): match_id = row[0] if match_id not in test: info = Info_Match( tournament=row[1], date=row[2], rounds=row[3], clock=row[4], score_home=[] ) test[match_id] = info # 追加当前行的主场分数(同一赛事可能有多条分数记录,需保留重复值) test[match_id].score_home.append(row[5]) print(test)
方案2:仅清空分数列表(保留其他字段数据)
如果需要保留test字典中实例的其他字段数据,仅清空score_home列表:
def func_previous_results(): global test # 清空所有已有实例的score_home列表 for info in test.values(): info.score_home.clear() # 执行sqlite3数据库查询逻辑 # ...(省略你的数据库连接、查询代码) # 处理查询结果 for row in previous_results_query.fetchall(): match_id = row[0] if match_id not in test: info = Info_Match( tournament=row[1], date=row[2], rounds=row[3], clock=row[4], score_home=[] ) test[match_id] = info test[match_id].score_home.append(row[5])
方案说明
- 方案1通过重置整个字典,确保所有
Info_Match实例都是基于本次查询的全新数据,彻底避免历史数据干扰。 - 方案2保留实例的其他字段数据,仅清空分数列表后重新填充本次查询结果,同样保证
score_home只包含单份正确数据。
内容的提问来源于stack exchange,提问作者user20812299
相关产品推荐
相关产品推荐

