如何为树莓派模拟超声系统开发非技术人员可操作的字典配置工具
RFID-GIF关联关系可视化管理方案
解决思路
把原脚本中硬编码的pre-intervention和post-intervention字典,迁移到JSON配置文件中,再用树莓派自带的Tkinter库做一个可视化表单工具,让同事不用碰代码就能完成关联关系的增删改查,操作后直接保存到配置文件,原设备脚本自动加载最新配置。
具体实现步骤
1. 迁移硬编码字典到JSON配置文件
先把你现有脚本里的两个字典内容导出到rfid_gif_mapping.json文件,格式如下:
{ "pre-intervention": { "RFID_TAG_001": "pre_scan_01.gif", "RFID_TAG_002": "pre_scan_02.gif" }, "post-intervention": { "RFID_TAG_001": "post_scan_01.gif", "RFID_TAG_003": "post_scan_03.gif" } }
然后修改原设备脚本,替换硬编码的字典,改成从JSON文件加载配置:
import json # 加载RFID-GIF关联配置 def load_rfid_mappings(): try: with open('rfid_gif_mapping.json', 'r') as f: return json.load(f) except FileNotFoundError: # 配置文件不存在时返回空结构 return {"pre-intervention": {}, "post-intervention": {}} # 初始化关联映射 rfid_mappings = load_rfid_mappings() # 后续脚本中直接使用rfid_mappings即可,比如扫描到标签后: # current_scene = "pre-intervention" # 或者通过按钮切换的当前场景 # gif_path = rfid_mappings[current_scene].get(scanned_tag, "default.gif")
2. 编写Tkinter可视化管理工具
这个工具不需要额外安装依赖(树莓派默认带Tkinter),直接运行就能用,包含场景切换、列表展示、增删改查、保存功能:
import tkinter as tk from tkinter import ttk, messagebox import json class RFIDGIFManager: def __init__(self, root): self.root = root self.root.title("RFID-GIF关联管理") self.mappings = self._load_config() # 场景切换选项卡 self.notebook = ttk.Notebook(root) self.notebook.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) # 预干预场景页面 self.pre_frame = ttk.Frame(self.notebook) self.notebook.add(self.pre_frame, text="pre-intervention") self._setup_frame(self.pre_frame, "pre-intervention") # 后干预场景页面 self.post_frame = ttk.Frame(self.notebook) self.notebook.add(self.post_frame, text="post-intervention") self._setup_frame(self.post_frame, "post-intervention") def _load_config(self): try: with open('rfid_gif_mapping.json', 'r') as f: return json.load(f) except FileNotFoundError: return {"pre-intervention": {}, "post-intervention": {}} def _save_config(self): with open('rfid_gif_mapping.json', 'w') as f: json.dump(self.mappings, f, indent=2) messagebox.showinfo("操作成功", "关联关系已保存!") def _setup_frame(self, frame, scene): # 关联列表展示 self.tree = ttk.Treeview(frame, columns=("RFID标签", "GIF路径"), show="headings") self.tree.heading("RFID标签", text="RFID标签") self.tree.heading("GIF路径", text="GIF路径") self.tree.column("RFID标签", width=150) self.tree.column("GIF路径", width=250) self.tree.pack(padx=5, pady=5, fill=tk.BOTH, expand=True) self._refresh_list(scene) # 输入区域 input_frame = ttk.Frame(frame) input_frame.pack(padx=5, pady=5, fill=tk.X) ttk.Label(input_frame, text="RFID标签:").grid(row=0, column=0, padx=5, pady=2, sticky=tk.W) self.rfid_entry = ttk.Entry(input_frame) self.rfid_entry.grid(row=0, column=1, padx=5, pady=2, sticky=tk.EW) ttk.Label(input_frame, text="GIF路径:").grid(row=1, column=0, padx=5, pady=2, sticky=tk.W) self.gif_entry = ttk.Entry(input_frame) self.gif_entry.grid(row=1, column=1, padx=5, pady=2, sticky=tk.EW) input_frame.columnconfigure(1, weight=1) # 操作按钮 btn_frame = ttk.Frame(frame) btn_frame.pack(padx=5, pady=5, fill=tk.X) ttk.Button(btn_frame, text="添加关联", command=lambda: self._add_entry(scene)).pack(side=tk.LEFT, padx=5) ttk.Button(btn_frame, text="编辑选中", command=lambda: self._edit_entry(scene)).pack(side=tk.LEFT, padx=5) ttk.Button(btn_frame, text="删除选中", command=lambda: self._delete_entry(scene)).pack(side=tk.LEFT, padx=5) ttk.Button(btn_frame, text="保存修改", command=self._save_config).pack(side=tk.RIGHT, padx=5) def _refresh_list(self, scene): # 清空列表 for item in self.tree.get_children(): self.tree.delete(item) # 加载当前场景的关联数据 for rfid, gif_path in self.mappings[scene].items(): self.tree.insert("", tk.END, values=(rfid, gif_path)) def _add_entry(self, scene): rfid = self.rfid_entry.get().strip() gif_path = self.gif_entry.get().strip() if not rfid or not gif_path: messagebox.showwarning("提示", "请填写完整的RFID标签和GIF路径") return self.mappings[scene][rfid] = gif_path self._refresh_list(scene) # 清空输入框 self.rfid_entry.delete(0, tk.END) self.gif_entry.delete(0, tk.END) def _edit_entry(self, scene): selected_item = self.tree.selection() if not selected_item: messagebox.showwarning("提示", "请先选中要编辑的条目") return item_data = self.tree.item(selected_item[0]) old_rfid = item_data["values"][0] new_rfid = self.rfid_entry.get().strip() new_gif = self.gif_entry.get().strip() if not new_rfid or not new_gif: messagebox.showwarning("提示", "请填写完整的修改内容") return # 更新关联数据 del self.mappings[scene][old_rfid] self.mappings[scene][new_rfid] = new_gif self._refresh_list(scene) self.rfid_entry.delete(0, tk.END) self.gif_entry.delete(0, tk.END) def _delete_entry(self, scene): selected_item = self.tree.selection() if not selected_item: messagebox.showwarning("提示", "请先选中要删除的条目") return item_data = self.tree.item(selected_item[0]) rfid = item_data["values"][0] if messagebox.askyesno("确认删除", f"确定要删除RFID标签「{rfid}」的关联吗?"): del self.mappings[scene][rfid] self._refresh_list(scene) if __name__ == "__main__": root = tk.Tk() app = RFIDGIFManager(root) root.geometry("500x400") root.mainloop()
3. 同事的操作流程
- 双击运行这个管理工具的.py文件(树莓派上直接点击即可)
- 点击顶部选项卡切换
pre-intervention或post-intervention场景 - 添加关联:在输入框填写RFID标签字符串和对应的GIF文件名(确保GIF和脚本在同一文件夹),点击「添加关联」
- 编辑关联:选中列表里的条目,在输入框修改内容后点击「编辑选中」
- 删除关联:选中条目,点击「删除选中」并确认
- 所有修改完成后点击「保存修改」,原超声设备脚本下次运行会自动加载最新配置
方案优势
- 完全无需编程知识,可视化操作门槛极低
- 配置文件用JSON格式存储,即使管理工具出问题,也能直接用文本编辑器打开修改(格式简单易读)
- 基于树莓派自带的Tkinter,不需要额外安装任何依赖包
内容的提问来源于stack exchange,提问作者user3568395
相关产品推荐
相关产品推荐

