树莓派无线开关项目中存储元组的Listbox更新异常问题求解
问题定位
代码存在多处逻辑错误,仅部分开关可正常更新,其余开关触发时会重复新增条目、状态无法同步,具体错误如下:
错误明细
- 变量覆盖问题:遍历
list_of_switches时,element_one、element_two会被每次循环的新值覆盖,最终仅保留最后一个开关的ID和状态,其余开关ID不会进入匹配逻辑 - 匹配范围错误:仅读取了Listbox当前遍历索引位置的单条数据赋值给
listboxdata,没有遍历Listbox所有条目匹配ID,匹配范围完全错误 - 新增逻辑错误:只要当前遍历到的Listbox条目和待更新开关ID不匹配就直接新增,没有遍历完所有条目确认ID是否存在,导致ID不在第一个位置时就会重复新增
- 插入对象错误:每次插入Listbox的是整个
list_of_switches列表,不是单个开关条目,导致Listbox每个元素都是完整开关列表,不符合展示预期 - 循环逻辑错误:
mainLoop内嵌套while True死循环,同时搭配root.after重复调度,会导致界面阻塞无响应,循环内重复读写pickle文件属于冗余操作
修复后代码
def mainLoop(): # 读取当前最新开关状态 list_of_switches = list(switch_collector.items()) # 持久化存储 单次更新即可 with open("Switch_Collector.txt", "wb") as pickle_out: pickle.dump(list_of_switches, pickle_out) # 逐个处理每个开关的状态更新 for sw_id, sw_status in list_of_switches: id_existed = False # 遍历Listbox全量条目匹配ID for idx in range(listbox.size()): current_entry = listbox.get(idx) entry_id = current_entry.split()[0] if entry_id == sw_id: # 匹配到ID 更新状态 listbox.delete(idx) listbox.insert(idx, f"{sw_id} {sw_status}") id_existed = True break # 无匹配ID 新增条目 if not id_existed: listbox.insert(END, f"{sw_id} {sw_status}") listbox.pack(pady=10) # 定时调度下一次更新 移除内部死循环 root.after(10, mainLoop) # 启动循环和界面 mainLoop() root.mainloop()
内容的提问来源于stack exchange,提问作者e_waldie
相关产品推荐
相关产品推荐

