diff --git a/src/gui/water_quality_gui_v2.py b/src/gui/water_quality_gui_v2.py index 5459c22..f3abda5 100644 --- a/src/gui/water_quality_gui_v2.py +++ b/src/gui/water_quality_gui_v2.py @@ -88,6 +88,8 @@ class WaterQualityGUI(QMainWindow): ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(my_appid) super().__init__() + self._is_syncing = False + icon_path = get_resource_path("data/icons-1/uitubiao.ico") self.setWindowIcon(QIcon(icon_path)) @@ -358,7 +360,7 @@ class WaterQualityGUI(QMainWindow): self._run_all_btn = QPushButton("> 运行完整流程") self._run_all_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('success')) self._run_all_btn.setMinimumHeight(35) - self._run_all_btn.clicked.connect(self._pipeline_executor.run_full_pipeline) + self._run_all_btn.clicked.connect(self._on_run_all_clicked) btn_layout.addWidget(self._run_all_btn) self._stop_btn = QPushButton("⏹ 停止") @@ -417,11 +419,21 @@ class WaterQualityGUI(QMainWindow): work_dir = data.get('work_dir', '') self.statusBar().showMessage(f"工作目录: {work_dir}") + def _on_run_all_clicked(self): + print("==== 按钮确实被按下了 ====", flush=True) + try: + self._pipeline_executor.run_full_pipeline() + except Exception as e: + print(f"执行器调用崩溃: {e}") + traceback.print_exc() + # ================================================================ # 导航 ↔ Tab 双向同步(纯 UI 路由) # ================================================================ def _on_step_list_changed(self, index): + if self._is_syncing: + return if index < 0: return item = self._step_list.item(index) @@ -432,10 +444,21 @@ class WaterQualityGUI(QMainWindow): return from src.gui.core.panel_registry import get_tab_index tab_index = get_tab_index(item_data) - if tab_index >= 0: + if tab_index < 0: + return + self._is_syncing = True + try: + # ★ 先触发懒加载:get_panel 内部 _ensure_loaded 自带 blockSignals + # 保护 removeTab/insertTab,面板实例化完成后再切 Tab, + # 此时 _ensure_loaded 发现已加载直接返回,不再触发索引偏移 + self._panel_factory.get_panel(item_data) self._tab_widget.setCurrentIndex(tab_index) + finally: + self._is_syncing = False def _on_tab_changed(self, index): + if self._is_syncing: + return if index < 0: return from src.gui.core.panel_registry import get_step_id_by_tab_index @@ -447,7 +470,11 @@ class WaterQualityGUI(QMainWindow): if not item: continue if item.data(Qt.UserRole) == target_step_id: - self._step_list.setCurrentRow(row) + self._is_syncing = True + try: + self._step_list.setCurrentRow(row) + finally: + self._is_syncing = False break # ================================================================