测试修改

This commit is contained in:
DXC
2026-06-23 14:39:54 +08:00
parent c4aa246c95
commit b8d263e494
21 changed files with 595 additions and 2706 deletions

View File

@ -22,39 +22,29 @@ from pathlib import Path
from typing import Optional, Union
# 用户口语编号 / 业务别名 → main_window 上真实属性名的映射
# 这是"张冠李戴"修复的核心——之前代码写的 step11_panel 实际不存在,
# 真实存在的属性见 water_quality_gui.py:1891-1928
# 用户口语编号 / 业务别名 → PANEL_REGISTRY 中真实 step_id 的映射
# 这是"张冠李戴"修复的核心——main_window 上已不再直接挂载 panel 属性,
# 所有面板都通过 _panel_factory.get_panel(step_id) 懒加载访问。
STEP_DATA_SOURCE = {
# 数据流 step 编号(用户口语) → main_window 真实属性
'step5_clean_output': 'step5_clean_panel',
'step7_index_output': 'step7_index_panel',
'step8_ml_train_output': 'step8_ml_train_panel',
'step8_5_non_empirical': 'step8_non_empirical_panel', # 之前写错成 step11_panel
'step9_ml_predict_output': 'step9_ml_predict_panel',
'step10_watercolor_output': 'step10_watercolor_panel',
'step11_ml_prediction': 'step9_ml_predict_panel', # 主流程 step11 = ML 预测
'step12_regression_prediction': 'step8_non_empirical_panel', # 主流程 step12 = 非经验预测
'step13_custom_regression': 'step13_report_panel', # 占位(自定义回归本身没有专属 panel)
'sampling_csv': 'step4_sampling_panel',
'training_spectra_csv': 'step5_clean_panel',
'indices_csv': 'step7_index_panel',
'models_dir': 'step8_ml_train_panel',
'watercolor_dir': 'step10_watercolor_panel',
'prediction_csv_dir': 'step9_ml_predict_panel', # 默认从 ML 预测读
# 数据流 step 编号(用户口语) → PANEL_REGISTRY 中的 step_id
'step5_clean_output': 'step5_clean',
'step7_index_output': 'step7_index',
'step8_ml_train_output': 'step8_ml_train',
'step8_5_non_empirical': 'step8_ml_train',
'step9_ml_predict_output': 'step9_ml_predict',
'step10_watercolor_output': 'step10_watercolor',
'step11_ml_prediction': 'step9_ml_predict', # 主流程 step11 = ML 预测
'step12_regression_prediction': 'step8_ml_train', # 主流程 step12 = 非经验预测
'step13_custom_regression': 'step13_report', # 自定义回归借用 step13 报告面板
'sampling_csv': 'step4_sampling',
'training_spectra_csv': 'step5_clean',
'indices_csv': 'step7_index',
'models_dir': 'step8_ml_train',
'watercolor_dir': 'step10_watercolor',
'prediction_csv_dir': 'step9_ml_predict', # 默认从 ML 预测读
}
def _get_widget(main_window, attr_name: str, widget_attr: str = 'output_file'):
"""从 main_window.<attr_name> 取出指定子组件,失败时返回 None。"""
if main_window is None:
return None
panel = getattr(main_window, attr_name, None)
if panel is None:
return None
return getattr(panel, widget_attr, None)
def _read_widget_path(widget) -> str:
"""统一从 widget 读 path(兼容 FileSelectWidget / QLineEdit / 字符串)。"""
if widget is None:
@ -75,15 +65,30 @@ def _read_widget_path(widget) -> str:
def resolve_step_widget(main_window, step_key: str, widget_attr: str = 'output_file'):
"""根据业务 step_key 解析出正确的 widget(消除张冠李戴)。
"""通过 panel_factory 访问对应面板,并获取其实际的输入/输出控件。
解析顺序:
1. STEP_DATA_SOURCE[step_key] 找到真实 step_id
2. main_window._panel_factory.get_panel(step_id) 懒加载拿到面板
3. getattr(panel, widget_attr) 取出真实控件
Returns:
widget 对象 or None(找不到时返回 None,调用方需自行兜底)
"""
attr_name = STEP_DATA_SOURCE.get(step_key)
if attr_name is None:
step_id = STEP_DATA_SOURCE.get(step_key)
if not step_id:
return None
return _get_widget(main_window, attr_name, widget_attr)
# 从主窗口获取工厂,再由工厂通过 step_id 拿出真实面板
factory = getattr(main_window, '_panel_factory', None)
if not factory:
return None
panel = factory.get_panel(step_id)
if not panel:
return None
return getattr(panel, widget_attr, None)
_FALLBACK_DIR_TABLE = {