新增加菜品后,处理需要程序重启才生效的Bug

This commit is contained in:
2025-11-13 14:24:41 +08:00
parent 9845d0b05f
commit d24b40c9ec
+38 -7
View File
@@ -792,6 +792,9 @@ class MultiModalFoodApp:
self.root.after(0, lambda: messagebox.showinfo("成功", f"索引构建完成!默认菜品:{len(default_labels)}个,自定义菜品:{len(self.custom_dishes)}个,总计:{len(all_labels)}"))
self.root.after(0, lambda: self.openset_status_label.configure(text=f"索引已构建 ({len(all_labels)}个菜品)", text_color="green"))
# 新增:重新加载索引到内存
self.root.after(0, self.reload_openset_matcher)
except Exception as e:
self.root.after(0, lambda: messagebox.showerror("错误", f"构建索引失败: {e}"))
self.root.after(0, lambda: self.openset_status_label.configure(text="构建失败", text_color="red"))
@@ -824,6 +827,32 @@ class MultiModalFoodApp:
messagebox.showerror("错误", f"索引测试失败: {e}")
self.openset_status_label.configure(text="索引无效", text_color="red")
def reload_openset_matcher(self):
"""重新加载向量索引(用于索引更新后刷新)"""
try:
index_path = self.openset_index_path_var.get()
# 检查索引是否存在
required_files = ["dish_names.json", "dish_embeddings.npy", "faiss_index.bin"]
for fname in required_files:
if not os.path.exists(os.path.join(index_path, fname)):
print(f"[ReloadMatcher] 索引文件不完整,缺少: {fname}")
return False
# 重新创建 matcher 和 embedder
embedder_url = self.ollama_url_var.get().strip() or DEFAULT_OLLAMA_URL
embedder_model = self.openset_embedder_model_var.get().strip()
self.openset_embedder = OllamaEmbedder(base_url=embedder_url, model=embedder_model)
self.openset_matcher = DishNameMatcher(index_dir=index_path)
num_dishes = len(self.openset_matcher.dish_names)
print(f"[ReloadMatcher] 成功重载索引,包含 {num_dishes} 个菜品")
return True
except Exception as e:
print(f"[ReloadMatcher] 重载失败: {e}")
return False
# -------------------- 识别流程 --------------------
def start_recognition(self):
if not self.uploaded_images:
@@ -1298,10 +1327,10 @@ class MultiModalFoodApp:
messagebox.showinfo("成功", f"已添加菜品:{dish_name}")
# 询问是否立即重建索引
# 自动重建索引(后台线程,不阻塞UI
if self.auto_rebuild_index_var.get():
if messagebox.askyesno("重建索引", "是否立即重建向量索引?"):
self.build_openset_index()
self.openset_status_label.configure(text="正在自动重建索引...", text_color="orange")
threading.Thread(target=self._build_index_thread, daemon=True).start()
def import_dishes_from_json(self):
"""从JSON文件批量导入菜品"""
@@ -1345,13 +1374,15 @@ class MultiModalFoodApp:
messagebox.showinfo(
"导入完成",
f"成功导入 {added_count} 个新菜品" f"(总计导入{len(new_dishes)}个,其中{len(new_dishes)-added_count}个已存在)" + f"当前自定义菜品数:{len(self.custom_dishes)}"
f"成功导入 {added_count} 个新菜品" +
f"(总计导入{len(new_dishes)}个,其中{len(new_dishes)-added_count}个已存在)" +
f"当前自定义菜品数:{len(self.custom_dishes)}"
)
# 询问是否重建索引
# 自动重建索引(后台线程)
if self.auto_rebuild_index_var.get() and added_count > 0:
if messagebox.askyesno("重建索引", f"已添加{added_count}个新菜品,是否立即重建向量索引?"):
self.build_openset_index()
self.openset_status_label.configure(text="正在自动重建索引...", text_color="orange")
threading.Thread(target=self._build_index_thread, daemon=True).start()
except Exception as e:
messagebox.showerror("错误", f"导入失败: {e}")