You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派无线开关项目中存储元组的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:18:03