Data publish Module

本文介绍了一种在统一产品数据发布平台上同时发布单包和整包数据的方法,旨在提高数据包打包效率并确保单包与整包数据的一致性。此流程特别适用于eCFG和CFG等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1      目的

本文主要是描述在统一产品数据发布平台如何发布数据包,在一次发布中同时发布单包和整包数据出来。

本文档面向对象包括但不限于:需求分析人员、设计人员、开发人员、测试人员、PDE

1.2      需求背景

1.2.1        背景

发布平台正式上线后,支持PDE分别发布单包和整包数据,但对于eCFGCFGPDE希望能够在一次发布中同时发布单包和整包,其中,整包用户PDE在配置器客户端做测试,单包用户在转测试集成阶段自动发布给测试部测试。

通过这种方式,一方面可以加快数据包打包效率,另一方面可以保证打出来的单包和整包的数据的一致性。

修改问题:未解析的引用 'input_analysis'包含 'except ImportError' 的 try 块中的 'Event' 也应在 except 块中定义包含 'except ImportError' 的 try 块中的 'EventType' 也应在 except 块中定义包含 'except ImportError' 的 try 块中的 'event_center' 也应在 except 块中定义包含 'except ImportError' 的 try 块中的 'BaseModule' 也应在 except 块中定义包含 'except ImportError' 的 try 块中的 'GlobalConfig' 也应在 except 块中定义在 '__init__.pyi' 中找不到引用 'util'在 '__init__.pyi' 中找不到引用 'util'类 'str' 的未解析的特性引用 'register_ui_callback'实例特性 _ui_callback 在 __init__ 外部定义PEP 8: W391 blank line at end of file代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 输入分析模块(修复所有导入和格式问题) """ import re import logging import sys import time import threading import uuid import importlib # 添加缺失的importlib导入 from pathlib import Path from typing import List, Dict, Callable, Union, Optional # 修复导入路径 - 改为绝对导入 try: from core.event_center import Event, EventType, event_center from core.base_module import BaseModule from core.global_config import GlobalConfig print("成功从 core.global_config 导入 GlobalConfig") print("导入成功!版本:", GlobalConfig.VERSION) except ImportError as e: print(f"核心导入失败: {e}") # 尝试动态导入作为备用方案 try: project_root = Path(__file__).parent.parent for module in ['event_center', 'base_module', 'global_config']: spec = importlib.util.spec_from_file_location( f"core.{module}", project_root / "core" / f"{module}.py" ) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) globals()[f"{module}"] = module print("动态导入核心模块成功!") except Exception as e: print(f"动态导入失败: {e}") sys.exit(1) # 检查模块实现情况 missing_modules = [] for module in ['input_analysis', 'combination_analysis', 'trend_analysis', 'number_generation', 'follow_analysis', 'dialog_manager']: # 修复缩进 try: importlib.import_module(f'modules.{module}') except ImportError: missing_modules.append(module) if missing_modules: print("警告:以下模块未实现 -", ", ".join(missing_modules)) # 配置日志器 logger = logging.getLogger('DLT_Module1') logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setFormatter(logging.Formatter( '[%(asctime)s.%(msecs)03d] %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) logger.addHandler(handler) class InputAnalysisModule(BaseModule): """输入分析模块(单例模式)""" class InputAnalyzer: def __init__(self, module_name="input_analysis"): self.module_id = module_name self.module_name = module_name @staticmethod def analyze(data): """静态分析方法""" return {"status": "success", "data": data} _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance._initialized = False return cls._instance class InputAnalysisModule(BaseModule): def __init__(self): if getattr(self, '_initialized', False): return # 使用正确的属性名和字典键 super().__init__(GlobalConfig.MODULE_IDS["MODULE1_ID"]) self._initialized = True self.module_id = GlobalConfig.MODULE1_ID def register_ui_callback(self, callback: Callable[[Dict], None]): """注册UI回调函数""" self._ui_callback = callback logger.info("✅ UI回调注册成功") def _setup_event_handlers(self): """配置事件处理器""" event_center.subscribe( event_type=str(EventType.MODULE_RUN), handler=self._handle_run_event, token=str(self.module_id) ) event_center.subscribe( event_type="run_analysis", handler=self._handle_run_event, token=str(self.module_id) ) logger.info("✅ 事件订阅完成") @staticmethod def _parse_numbers(input_data: Union[str, List]) -> List[int]: """解析输入数字""" if isinstance(input_data, str): return [int(n) for n in re.split(r'[, \t]+', input_data.strip()) if n] return list(map(int, input_data)) if isinstance(input_data, list) else [] def analyze(self, data: Dict) -> Dict: """执行输入分析""" try: exclude_front = self._parse_numbers(data.get('exclude_front', [])) exclude_back = self._parse_numbers(data.get('exclude_back', [])) logger.info(f"分析中... 排除: 前区{exclude_front} 后区{exclude_back}") return { 'recommended_fronts': sorted(set(range(1, 36)) - set(exclude_front))[:5], 'recommended_backs': sorted(set(range(1, 13)) - set(exclude_back))[:2], 'exclude_front': exclude_front, 'exclude_back': exclude_back } except Exception as analysis_error: logger.error("分析失败: %s", str(analysis_error), exc_info=True) raise def _handle_run_event(self, event: Event): """处理运行事件""" try: if event.target != self.module_id: logger.warning("目标模块不匹配: %s", event.target) return result = self.analyze(event.data) response = { "event_id": str(event.event_id), "status": "success", "data": { "recommended": { "front": result['recommended_fronts'], "back": result['recommended_backs'] }, "excluded": { "front": result['exclude_front'], "back": result['exclude_back'] } } } self._send_result(event, response) self._notify_ui(response) except Exception as handle_error: error_data = { "event_id": str(getattr(event, 'event_id', 0)), "status": "error", "message": str(handle_error) } self._notify_ui(error_data) logger.error("处理失败: %s", str(handle_error), exc_info=True) def _send_result(self, event: Event, result: Dict): """发送结果事件""" result_event = Event( event_id=str(event.event_id), type=str(EventType.ANALYSIS_RESULT), source=str(self.module_id), target=str(event.source), data={ "recommended_fronts": result['data']['recommended']['front'], "recommended_backs": result['data']['recommended']['back'], "exclude_front": result['data']['excluded']['front'], "exclude_back": result['data']['excluded']['back'] }, token=str(self.module_id) ) event_center.publish(result_event) def _notify_ui(self, data: Dict): """通知UI更新""" if not self._ui_callback: return try: if threading.current_thread() == threading.main_thread(): self._ui_callback(data) else: import tkinter as tk tk_root = tk.Tk() tk_root.after_idle(lambda: self._ui_callback(data)) except Exception as ui_error: logger.error("UI通知失败: %s", str(ui_error)) def submit_data(self, data: str, label: str = "输入分析"): """提交分析数据""" event = Event( event_id=str(uuid.uuid4()), type=str(EventType.DATA_SUBMIT), source=str(self.module_id), target='number_pool', data={"command": "run", "label": label, "data": data}, token=str(self.module_id) ) event_center.publish(event) # 单例实例 GlobalConfig.module1_id = input_analysis, if __name__ == "__main__": def ui_handler(ui_data): print("\n=== UI更新 ===") print("状态:", ui_data.get("status")) if ui_data["status"] == "success": print("推荐号码:", ui_data["data"]["recommended"]) else: print("错误:", ui_data["message"]) print("=" * 30) module.register_ui_callback(ui_handler) test_event = Event( event_id=str(int(time.time())), type=str(EventType.MODULE_RUN), source="TEST", target=str(GlobalConfig.MODULE1_ID), data={"exclude_front": "1,2,3", "exclude_back": [1]}, token="test_token" ) event_center.publish(test_event) time.sleep(1)
08-10
文件input_analysis.py里修改问题》2025-08-21 18:58:50,177 - InputAnalysis - INFO - ✅ 事件订阅完成 2025-08-21 18:58:50,178 - ui.main_interface - WARNING - 模块 InputAnalysisModule 没有 register_callback 方法 2025-08-21 18:58:50,178 - ui.main_interface - WARNING - 模块 InputAnalysisModule 没有 register_callback 方法。。。#!/usr/bin/env python3 -- coding: utf-8 -- modules/input_analysis.py “”" 输入分析模块实现 (修复版) 修复核心错误: 无法导入核心模块 “”" import re import logging import uuid import threading import sys import os import pandas as pd from pathlib import Path from typing import List, Dict, Union, Optional from datetime import datetime ===== 修复核心模块导入问题 ===== 确保可以找到核心模块 try: # 获取项目根目录 project_root = Path(file).resolve().parent.parent print(f"项目根目录: {project_root}") # 将项目根目录添加到Python路径 if str(project_root) not in sys.path: sys.path.insert(0, str(project_root)) print(f"已将项目根目录添加到sys.path: {project_root}") # 尝试导入核心模块 from core.event_center import Event, EventType, event_center from core.base_module import BaseModule from core.global_config import GlobalConfig print("✅ 核心模块导入成功") except ImportError as import_error: print(f"❌ 无法导入核心模块: {import_error}“) print(f"当前工作目录: {os.getcwd()}”) print(f"文件路径: {file}") sys.exit(1) 配置日志器 logger = logging.getLogger(‘InputAnalysis’) logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setFormatter(logging.Formatter( ‘[%(asctime)s.%(msecs)03d] %(levelname)s - %(message)s’, datefmt=‘%Y-%m-%d %H:%M:%S’ )) logger.addHandler(handler) class InputAnalysisModule(BaseModule): “”“输入分析模块主类”“” MODULE_ID = GlobalConfig.MODULE1_ID def __init__(self, module_config: Optional[Dict] = None): """初始化分析模块""" super().__init__(module_config.get('module_name', "input_analysis") if module_config else "input_analysis") self.module_config = module_config or {} self.module_id = self.module_config.get('module_id', self.MODULE_ID) self.labels = self.module_config.get('labels', {}) self.df = self.module_config.get('df', pd.DataFrame()) # 初始化必要的属性 self._instance_lock = threading.Lock() self._results_by_token = {} # 存储每个token的分析结果 logger.info(f"★ 模块初始化完成 [ID: {self.module_id}]") self._setup_event_handlers() def _open_dialog(self): """实现抽象方法 - 打开对话框""" logger.info(f"打开 {self.module_id} 的对话框") # 这里可以调用具体的UI对话框 def run_module(self, data=None, **kwargs): """实现抽象方法 - 运行模块""" logger.info(f"运行 {self.module_id} 模块") try: # 使用data和kwargs参数 if data is not None: logger.debug(f"接收到数据参数: {type(data)}") if kwargs: logger.debug(f"接收到额外参数: {kwargs}") # 确定使用的数据 analysis_data = data if data is not None else self.df # 这里实现具体的分析逻辑 result = self.analyze(analysis_data if isinstance(analysis_data, dict) else {}) return result except Exception as e: logger.error(f"模块运行失败: {e}") return {"status": "error", "message": str(e)} def _setup_event_handlers(self): """配置事件处理器""" # 添加对运行指令和获取结果指令的订阅 event_center.subscribe( event_type="run_analysis", handler=self._handle_run_analysis, token=self.module_id ) event_center.subscribe( event_type="get_results", handler=self._handle_get_results, token=self.module_id ) logger.info("✅ 事件订阅完成") def _handle_run_analysis(self, event: Event): """处理运行分析指令""" try: logger.info(f"收到运行分析指令,token: {event.token}") token = event.token # 提取分析参数 params = event.data.get('params', {}) input_data = event.data.get('input_data', "") # 执行分析 analysis_result = self.analyze({ 'exclude_front': params.get('exclude_front', []), 'exclude_back': params.get('exclude_back', []), 'input_data': input_data }) # 存储结果并关联token with self._instance_lock: self._results_by_token[token] = analysis_result # 回传结果到相同token的UI位置 self._send_result_to_ui(token, analysis_result) logger.info(f"分析完成,结果已回传至token: {token}") except Exception as run_error: logger.error(f"处理运行指令失败: {str(run_error)}", exc_info=True) self._send_error(event, f"分析失败: {str(run_error)}") def _handle_get_results(self, event: Event): """处理获取结果指令""" try: token = event.token logger.info(f"收到获取结果请求,token: {token}") # 从存储中获取结果 with self._instance_lock: result = self._results_by_token.get(token, {}) if not result: raise ValueError(f"未找到token: {token}对应的分析结果") # 回传结果到相同token的UI位置 self._send_result_to_ui(token, result) logger.info(f"结果已回传至token: {token}") except Exception as get_error: logger.error(f"获取结果失败: {str(get_error)}", exc_info=True) self._send_error(event, f"获取结果失败: {str(get_error)}") def _send_result_to_ui(self, token: str, result: Dict): """将结果发送到指定token的UI位置""" try: # 使用pd.Timestamp获取当前时间戳 timestamp = pd.Timestamp.now().isoformat() except NameError: timestamp = datetime.now().isoformat() logger.warning("pd未定义,使用datetime作为时间戳备用方案") result_event = Event( event_id=str(uuid.uuid4()), type="analysis_result", source=str(self.module_id), target="ui_update", data={ "token": token, "result": result, "timestamp": timestamp }, token=token ) event_center.publish(result_event) logger.debug(f"结果已发送至UI,token: {token}") @staticmethod def _parse_numbers(input_data: Union[str, List]) -> List[int]: """解析输入数字""" if isinstance(input_data, str): # 支持多种分隔符:逗号、空格、制表符 return [int(n) for n in re.split(r'[, \t]+', input_data.strip()) if n] return list(map(int, input_data)) if isinstance(input_data, list) else [] def analyze(self, data: Dict) -> Dict: """执行输入分析""" try: exclude_front = self._parse_numbers(data.get('exclude_front', [])) exclude_back = self._parse_numbers(data.get('exclude_back', [])) logger.info(f"分析中... 排除: 前区{exclude_front} 后区{exclude_back}") # 生成推荐号码 (前区1-35, 后区1-12) return { 'recommended_fronts': sorted(set(range(1, 36)) - set(exclude_front))[:5], 'recommended_backs': sorted(set(range(1, 13)) - set(exclude_back))[:2], 'exclude_front': exclude_front, 'exclude_back': exclude_back } except Exception as analysis_error: logger.error("分析失败: %s", str(analysis_error), exc_info=True) return {"status": "error", "message": str(analysis_error)} def _send_result(self, event: Event, result: Dict): """发送结果事件""" result_event = Event( event_id=str(event.event_id), type=EventType.ANALYSIS_RESULT, source=str(self.module_id), target=str(event.source), data=result, token=str(self.module_id) ) event_center.publish(result_event) def _send_error(self, event: Event, error_msg: str): """发送错误事件""" error_event = Event( event_id=str(getattr(event, 'event_id', uuid.uuid4())), type=EventType.MODULE_ERROR, source=str(self.module_id), target=str(getattr(event, 'source', 'unknown')), data={ "status": "error", "message": error_msg }, token=str(self.module_id) ) event_center.publish(error_event) def submit_data(self, data: str, label: str = "输入分析"): """提交分析数据""" event = Event( event_id=str(uuid.uuid4()), type=EventType.DATA_SUBMIT, source=str(self.module_id), target='number_pool', data={ "command": "run", "label": label, "data": data }, token=str(self.module_id) ) event_center.publish(event) class InputAnalyzer: “”“兼容层分析器(用于保持与main.py的兼容性)”“” _instance = None _lock = threading.Lock() def __new__(cls, module_config=None): """实现单例模式,支持参数传递""" if cls._instance is None: with cls._lock: if cls._instance is None: cls._instance = super().__new__(cls) cls._instance._module_config = module_config or {} return cls._instance def __init__(self, module_config=None): # 确保只初始化一次 if not hasattr(self, '_initialized'): self.module_config = module_config or {} self.df = self.module_config.get('df', pd.DataFrame()) # 设置默认配置 if not self.module_config: self.module_config = { 'module_id': GlobalConfig.MODULE1_ID, 'labels': GlobalConfig.get_module_labels(GlobalConfig.MODULE1_ID) } # 创建实际分析模块实例 self._analyzer = InputAnalysisModule(self.module_config) self._initialized = True def analyze_data(self, data): """分析数据的具体实现""" return self._analyzer.analyze(data) def run_module(self, data=None, **kwargs): """运行模块""" return self._analyzer.run_module(data, **kwargs) @staticmethod def analyze(data: Dict) -> Dict: """静态分析方法(兼容接口)""" instance = InputAnalyzer() return instance._analyzer.analyze(data)
最新发布
08-22
修改问题:未解析的引用 'logger'未解析的引用 'logger'未解析的引用 'logger'未解析的引用 'logger'未解析的引用 'logger'未解析的引用 'logger'未解析的引用 'logger'未解析的引用 'logger'意外实参重复的代码段(13 行长)重复的代码段(13 行长)代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import tkinter as tk import datetime import pandas as pd from pathlib import Path from typing import Dict, Optional, Any, Callable from tkinter import Frame, Label, Button from project.core.global_config import GlobalConfig from project.core.number_pool import NumberPool from project.core.app_context import app_context from project.core.event_center import EventCenter from project.modules.input_analysis import InputAnalysisModule from project.modules.combination_analysis import CombinationAnalysisModule from project.modules.follow_analysis import FollowAnalysisModule from project.modules.trend_analysis import TrendAnalyzer from project.modules.number_generation import NumberGenerator from project.ui.dialog_manager import DialogManager class MainInterface: def __init__(self, root: tk.Tk, pool: NumberPool): self.root = root self.pool = pool self.app = app_context self._callbacks: Dict[str, Callable] = {} # 回调函数字典 # 初始化事件中心 self.app.event_center = GlobalConfig.init_event_center() # 初始化UI变量 self._init_ui_variables() # 创建主容器 self.main_frame = tk.Frame(root) self.main_frame.pack(fill=tk.BOTH, expand=True) # 初始化所有模块 self._init_modules() # 设置UI self._setup_ui() # 设置应用引用 app_context.dialog_manager = DialogManager() app_context.main_ui = self def register_callback(self, event_type: str, callback: Callable) -> None: """注册回调函数""" self._callbacks[event_type] = callback def _init_modules(self): """初始化所有模块 - 修正参数传递""" self.module_content_frame = tk.Frame(self.main_frame) self.module_content_frame.pack(fill=tk.BOTH, expand=True) # 模块1: 输入分析 self.module1 = InputAnalysisModule( module_config={ 'module_id': GlobalConfig.MODULE1_ID, 'labels': GlobalConfig.get_module_labels(GlobalConfig.MODULE1_ID) } ) self._register_module_callback(self.module1) # 模块2: 组合分析 self.module2 = CombinationAnalysisModule( module_config={ 'module_id': GlobalConfig.MODULE2_ID, 'labels': GlobalConfig.get_module_labels(GlobalConfig.MODULE2_ID), 'event_center': self.app.event_center } ) self._register_module_callback(self.module2) # 模块3: 跟随分析 self.module3 = FollowAnalysisModule( module_config={ 'module_id': GlobalConfig.MODULE3_ID, 'labels': GlobalConfig.get_module_labels(GlobalConfig.MODULE3_ID) } ) self._register_module_callback(self.module3) # 模块4: 趋势分析 self.module4 = TrendAnalyzer( df=pd.DataFrame(), event_cevent=self.app.event_center, module_config={ 'module_id': GlobalConfig.MODULE4_ID, 'labels': GlobalConfig.get_module_labels(GlobalConfig.MODULE4_ID), 'event_handlers': { 'run_analysis': self._handle_run_analysis, 'get_results': self._handle_get_results } } ) self._register_module_callback(self.module4) # 模块5: 数字生成 self.module5 = NumberGenerator( module_config={ 'module_id': GlobalConfig.MODULE5_ID, 'labels': GlobalConfig.get_module_labels(GlobalConfig.MODULE5_ID) } ) self._register_module_callback(self.module5) # 保存模块引用 self.app.modules = { GlobalConfig.MODULE1_ID: self.module1, GlobalConfig.MODULE2_ID: self.module2, GlobalConfig.MODULE3_ID: self.module3, GlobalConfig.MODULE4_ID: self.module4, GlobalConfig.MODULE5_ID: self.module5 } def _register_module_callback(self, module: Any) -> None: """统一注册模块回调""" if hasattr(module, 'register_callback'): module.register_callback(self._handle_analysis_result) else: print(f"警告: 模块 {type(module).__name__} 没有 register_callback 方法") def _handle_run_analysis(self, event_data: Dict[str, Any]) -> None: """处理运行分析请求""" if not isinstance(event_data, dict): logger.error("无效的事件数据格式") return # 获取token和参数 token = event_data.get('token') params = event_data.get('params', {}) # 记录接收到的请求 logger.info(f"收到运行分析请求,token: {token}, 参数: {params}") try: # 获取前端输入数据 front_nums = [int(x) for x in self.front_var.get().split(",") if x.strip()] back_nums = [int(x) for x in self.back_var.get().split(",") if x.strip()] # 准备分析数据 data = { 'front_numbers': front_nums, 'back_numbers': back_nums, 'config': {var_name: getattr(self, f"{var_name}_var").get() for _, var_name, _ in GlobalConfig.UI_CONFIG} } # 调用模块分析方法 analysis_result = self.module1.analyze(data=data) # 回传结果到指定token的UI位置 self._send_result_to_ui(token, analysis_result) # 发布分析完成事件 if self.app.event_center: self.app.event_center.publish( event_type="analysis_completed", data={ 'token': token, 'result': analysis_result, 'timestamp': datetime.datetime.now().isoformat() } ) except Exception as e: error_msg = f"分析过程中出错: {str(e)}" logger.error(error_msg) self._send_result_to_ui(token, {"error": error_msg}) def _handle_get_results(self, event_data: Dict[str, Any]) -> Dict[str, Any]: """处理获取结果请求""" if not isinstance(event_data, dict): logger.error("无效的事件数据格式") return {"error": "无效的事件数据格式"} token = event_data.get('token') logger.info(f"收到获取结果请求,token: {token}") try: # 这里可以根据需要从模块获取最新结果 # 例如: result = self.module1.get_latest_results() result = {"status": "success", "data": "示例结果数据"} # 回传结果到指定token的UI位置 self._send_result_to_ui(token, result) return result except Exception as e: error_msg = f"获取结果过程中出错: {str(e)}" logger.error(error_msg) self._send_result_to_ui(token, {"error": error_msg}) return {"error": error_msg} def _send_result_to_ui(self, token: str, result: Dict[str, Any]) -> None: """将结果发送到指定token的UI位置""" if not token: logger.warning("未提供token,无法定位UI位置") return logger.info(f"准备将结果发送到token: {token}") # 这里实现将结果发送到指定token对应的UI元素 # 实际实现可能依赖于您的UI框架 # 示例实现 - 通过事件中心发送 if self.app.event_center: self.app.event_center.publish( event_type="update_ui", data={ 'token': token, 'result': result, 'timestamp': datetime.datetime.now().isoformat() } ) # 同时更新主界面显示 self._handle_analysis_result(result) def _init_ui_variables(self): """初始化UI变量""" self.front_var = tk.StringVar() self.back_var = tk.StringVar() self.trend_var = tk.StringVar() # 初始化所有UI配置变量 for _, var_name, _ in GlobalConfig.UI_CONFIG: if not hasattr(self, f"{var_name}_var"): setattr(self, f"{var_name}_var", tk.StringVar()) def _setup_ui(self): """设置主界面UI""" # 标题 title_label = tk.Label( self.main_frame, text=GlobalConfig.VERSION, font=("Arial", 16, "bold") ) title_label.pack(pady=10) # 动态创建UI配置项 for label_text, var_name, _ in GlobalConfig.UI_CONFIG: frame = tk.Frame(self.module_content_frame) frame.pack(fill=tk.X, padx=10, pady=5) tk.Label(frame, text=label_text, width=15, anchor='w').pack(side=tk.LEFT) entry = tk.Entry( frame, textvariable=getattr(self, f"{var_name}_var"), width=25 ) entry.pack(side=tk.LEFT, padx=5) # 按钮区域 button_frame = tk.Frame(self.main_frame) button_frame.pack(fill=tk.X, padx=10, pady=10) tk.Button( button_frame, text="开始分析", command=self._start_analysis ).pack(side=tk.LEFT, padx=5) tk.Button( button_frame, text="保存配置", command=self._save_config ).pack(side=tk.LEFT, padx=5) def _start_analysis(self): """处理分析按钮点击 - 移除不必要的df参数""" try: front_nums = [int(x) for x in self.front_var.get().split(",") if x.strip()] back_nums = [int(x) for x in self.back_var.get().split(",") if x.strip()] # 创建必要的data参数 data = { 'front_numbers': front_nums, 'back_numbers': back_nums, 'config': {var_name: getattr(self, f"{var_name}_var").get() for _, var_name, _ in GlobalConfig.UI_CONFIG} } # 调用模块分析方法 - 只传递必要的data参数 analysis_result = self.module1.analyze(data=data) self._handle_analysis_result(data=analysis_result) # 发送分析完成事件 if self.app.event_center: self.app.event_center.publish( event_type="analysis_completed", data={ 'module': GlobalConfig.MODULE1_ID, 'result': analysis_result, 'timestamp': datetime.datetime.now().isoformat() } ) except ValueError as e: print(f"输入错误: {e}") if self.app.event_center: self.app.event_center.publish( event_type="analysis_error", data={ 'module': GlobalConfig.MODULE1_ID, 'error': str(e), 'timestamp': datetime.datetime.now().isoformat() } ) def _save_config(self): """保存当前配置""" try: config_data = { var_name: getattr(self, f"{var_name}_var").get() for _, var_name, _ in GlobalConfig.UI_CONFIG if hasattr(self, f"{var_name}_var") } save_path = GlobalConfig.MODULE_SAVE_PATHS[GlobalConfig.MODULE1_ID] # 确保目录存在 Path(save_path).parent.mkdir(parents=True, exist_ok=True) with open(save_path, 'w', encoding='utf-8') as f: json.dump(config_data, f, ensure_ascii=False, indent=2) print(f"配置已保存到: {save_path}") # 发送配置保存事件 if self.app.event_center: self.app.event_center.publish( event_type="config_saved", data={ 'module': GlobalConfig.MODULE1_ID, 'path': save_path, 'timestamp': datetime.datetime.now().isoformat() } ) except Exception as e: print(f"保存配置失败: {e}") if self.app.event_center: self.app.event_center.publish( event_type="config_error", data={ 'module': GlobalConfig.MODULE1_ID, 'error': str(e), 'timestamp': datetime.datetime.now().isoformat() } ) def _handle_analysis_result(self, data: dict): """处理分析结果""" print("收到分析结果:", data) # 更新UI显示 if "front" in data: self.front_var.set(",".join(map(str, data["front"]))) if "back" in data: self.back_var.set(",".join(map(str, data["back"]))) # 发送UI更新事件 if self.app.event_center: self.app.event_center.publish( event_type="ui_updated", data={ 'module': GlobalConfig.MODULE1_ID, 'updated_vars': ['front', 'back'], 'timestamp': datetime.datetime.now().isoformat() } )
08-19
修改问题::Traceback (most recent call last): File "<string>", line 2, in <module> ModuleNotFoundError: No module named 'modules'其它问题:未解析的引用 'core'未解析的引用 'core'未解析的引用 'core'包含 'except ImportError' 的 try 块中的 'global_config' 也应在 except 块中定义在 '__init__.pyi' 中找不到引用 'util'在 '__init__.pyi' 中找不到引用 'util'找不到模块 'Event'找不到模块 'EventType',找不到模块 'event_center'找不到模块 'BaseModule'找不到模块 'GlobalConfig'从外部作用域隐藏名称 'module_name'从外部作用域隐藏名称 'e'从外部作用域隐藏名称 'e'从外部作用域隐藏名称 'e'代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- __all__ = ['InputAnalysisModule'] # 修正导出声明 import sys import re import logging import time import threading import uuid import importlib from pathlib import Path from typing import List, Dict, Callable, Union, Optional # 添加项目根目录到路径 sys.path.insert(0, str(Path(__file__).parent.parent)) # 修复导入路径 - 使用直接导入 try: from core import event_center, base_module, global_config from core.event_center import Event, EventType from core.base_module import BaseModule GlobalConfig = global_config.GlobalConfig UI_CONFIG = GlobalConfig.UI_CONFIG except ImportError: # 保持原有动态导入逻辑 try: project_root = Path(__file__).parent.parent for module_name in ['event_center', 'base_module', 'global_config']: spec = importlib.util.spec_from_file_location( f"core.{module_name}", project_root / "core" / f"{module_name}.py" ) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) sys.modules[f"core.{module_name}"] = module from core.event_center import Event, EventType, event_center from core.base_module import BaseModule from core.global_config import GlobalConfig except Exception as e: print(f"导入失败: {e}") sys.exit(1) # 配置日志器 logger = logging.getLogger('DLT_Module') logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setFormatter(logging.Formatter( '[%(asctime)s.%(msecs)03d] %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) logger.addHandler(handler) class InputAnalyzer: """输入分析器辅助类""" def __init__(self, module_name="input_analysis"): self.module_id = module_name self.module_name = module_name @staticmethod def analyze(data): return {"status": "success", "data": data} class InputAnalysisModule(BaseModule): MODULE_ID = "input_analysis" def __init__(self): if getattr(self, '_initialized', False): return super().__init__(self.MODULE_ID) self._ui_callback = None self._initialized = True logger.info(f"★ 模块初始化完成 [ID: {self.MODULE_ID}]") self._setup_event_handlers() def register_ui_callback(self, callback: Callable[[Dict], None]): """注册UI回调函数""" self._ui_callback = callback logger.info("✅ UI回调注册成功") def _setup_event_handlers(self): """配置事件处理器""" event_center.subscribe( event_type=str(EventType.MODULE_RUN), handler=self._handle_run_event, token=str(self.module_id) ) event_center.subscribe( event_type="run_analysis", handler=self._handle_run_event, token=str(self.module_id) ) logger.info("✅ 事件订阅完成") @staticmethod def _parse_numbers(input_data: Union[str, List]) -> List[int]: """解析输入数字""" if isinstance(input_data, str): return [int(n) for n in re.split(r'[, \t]+', input_data.strip()) if n] return list(map(int, input_data)) if isinstance(input_data, list) else [] def analyze(self, data: Dict) -> Dict: """执行输入分析""" try: exclude_front = self._parse_numbers(data.get('exclude_front', [])) exclude_back = self._parse_numbers(data.get('exclude_back', [])) logger.info(f"分析中... 排除: 前区{exclude_front} 后区{exclude_back}") return { 'recommended_fronts': sorted(set(range(1, 36)) - set(exclude_front))[:5], 'recommended_backs': sorted(set(range(1, 13)) - set(exclude_back))[:2], 'exclude_front': exclude_front, 'exclude_back': exclude_back } except Exception as e: logger.error("分析失败: %s", str(e), exc_info=True) raise def _handle_run_event(self, event: Event): """处理运行事件""" try: if event.target != self.module_id: logger.warning("目标模块不匹配: %s", event.target) return result = self.analyze(event.data) response = { "event_id": str(event.event_id), "status": "success", "data": { "recommended": { "front": result['recommended_fronts'], "back": result['recommended_backs'] }, "excluded": { "front": result['exclude_front'], "back": result['exclude_back'] } } } self._send_result(event, response) self._notify_ui(response) except Exception as e: error_data = { "event_id": str(getattr(event, 'event_id', 0)), "status": "error", "message": str(e) } self._notify_ui(error_data) logger.error("处理失败: %s", str(e), exc_info=True) def _send_result(self, event: Event, result: Dict): """发送结果事件""" result_event = Event( event_id=str(event.event_id), type=str(EventType.ANALYSIS_RESULT), source=str(self.module_id), target=str(event.source), data={ "recommended_fronts": result['data']['recommended']['front'], "recommended_backs": result['data']['recommended']['back'], "exclude_front": result['data']['excluded']['front'], "exclude_back": result['data']['excluded']['back'] }, token=str(self.module_id) ) event_center.publish(result_event) def _notify_ui(self, data: Dict): """通知UI更新""" if not self._ui_callback: return try: self._ui_callback(data) except Exception as e: logger.error("UI通知失败: %s", str(e)) def submit_data(self, data: str, label: str = "输入分析"): """提交分析数据""" event = Event( event_id=str(uuid.uuid4()), type=str(EventType.DATA_SUBMIT), source=str(self.module_id), target='number_pool', data={"command": "run", "label": label, "data": data}, token=str(self.module_id) ) event_center.publish(event) if __name__ == "__main__": module = InputAnalysisModule() def ui_handler(ui_data): print("\n=== UI更新 ===") print("状态:", ui_data.get("status")) if ui_data.get("status") == "success": print("推荐号码:", ui_data["data"]["recommended"]) else: print("错误:", ui_data.get("message")) print("=" * 30) module.register_ui_callback(ui_handler) test_event = Event( event_id=str(int(time.time())), type=str(EventType.MODULE_RUN), source="TEST", target="input_analysis", data={"exclude_front": "1,2,3", "exclude_back": [1]}, token="test_token" ) event_center.publish(test_event) time.sleep(1)
08-09
修改问题:Traceback (most recent call last): File "<string>", line 2, in <module> File "C:\Users\Administrator\Desktop\project\modules\input_analysis.py", line 111 def register_ui_callback(self, callback: Callable[[Dict], None]): IndentationError: unexpected indent,其它问题有:未解析的引用 'InputAnalyzer'意外缩进应为语句,实际为 Py:DEDENT在 '__init__.pyi' 中找不到引用 'util'在 '__init__.pyi' 中找不到引用 'util'方法上的装饰器 @staticmethod 位于类外部源代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 在文件顶部添加导出声明 __all__ = ['InputAnalyzer', 'InputAnalysisModule'] """ 输入分析模块(修复所有导入和格式问题) """ import sys import re import logging import time import threading import uuid import importlib from pathlib import Path from typing import List, Dict, Callable, Union, Optional # 添加项目根目录到路径 sys.path.insert(0, str(Path(__file__).parent.parent)) # 修复导入路径 - 改为绝对导入 try: from core.event_center import Event, EventType, event_center from core.base_module import BaseModule from core.global_config import GlobalConfig UI_CONFIG = GlobalConfig.UI_CONFIG # 通过类访问配置 print("成功从 core.global_config 导入 GlobalConfig") print("导入成功!版本:", GlobalConfig.VERSION) except ImportError as e: print(f"核心导入失败: {e}") # 尝试动态导入作为备用方案 try: project_root = Path(__file__).parent.parent # 动态加载核心模块 for module_name in ['event_center', 'base_module', 'global_config']: spec = importlib.util.spec_from_file_location( f"core.{module_name}", project_root / "core" / f"{module_name}.py" ) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) # 显式导入需要的类和对象 if module_name == 'event_center': globals().update({ 'Event': module.Event, 'EventType': module.EventType, 'event_center': module.event_center }) elif module_name == 'base_module': globals()['BaseModule'] = module.BaseModule elif module_name == 'global_config': globals()['GlobalConfig'] = module.GlobalConfig print("动态导入核心模块成功!") except Exception as e: print(f"动态导入失败: {e}") sys.exit(1) # 检查模块实现情况 missing_modules = [] for module in ['input_analysis', 'combination_analysis', 'trend_analysis', 'number_generation', 'follow_analysis', 'dialog_manager']: try: importlib.import_module(f'modules.{module}') except ImportError: missing_modules.append(module) if missing_modules: print("警告:以下模块未实现 -", ", ".join(missing_modules)) # 配置日志器 logger = logging.getLogger('DLT_Module1') logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setFormatter(logging.Formatter( '[%(asctime)s.%(msecs)03d] %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) logger.addHandler(handler) class InputAnalysisModule(BaseModule): MODULE_ID = "input_analysis" # ✅ 全大写常量名 _instance_lock = threading.Lock() def __new__(cls): if not hasattr(cls, "_instance"): with cls._instance_lock: if not hasattr(cls, "_instance"): cls._instance = super().__new__(cls) cls._instance._initialized = False return cls._instance def __init__(self): if getattr(self, '_initialized', False): return super().__init__(self.MODULE_ID) # ✅ 统一使用类常量 self._ui_callback = None self._initialized = True self.module_id = self.MODULE_ID # ✅ 避免ID不一致 logger.info(f"★ 模块初始化完成 [ID: {self.module_id}]") self._setup_event_handlers() __all__ = ['InputAnalysisModule'] def register_ui_callback(self, callback: Callable[[Dict], None]): """注册UI回调函数""" self._ui_callback = callback logger.info("✅ UI回调注册成功") def _setup_event_handlers(self): """配置事件处理器""" event_center.subscribe( event_type=str(EventType.MODULE_RUN), handler=self._handle_run_event, token=str(self.module_id) ) event_center.subscribe( event_type="run_analysis", handler=self._handle_run_event, token=str(self.module_id) ) logger.info("✅ 事件订阅完成") @staticmethod def _parse_numbers(input_data: Union[str, List]) -> List[int]: """解析输入数字""" if isinstance(input_data, str): return [int(n) for n in re.split(r'[, \t]+', input_data.strip()) if n] return list(map(int, input_data)) if isinstance(input_data, list) else [] def analyze(self, data: Dict) -> Dict: """执行输入分析""" try: exclude_front = self._parse_numbers(data.get('exclude_front', [])) exclude_back = self._parse_numbers(data.get('exclude_back', [])) logger.info(f"分析中... 排除: 前区{exclude_front} 后区{exclude_back}") return { 'recommended_fronts': sorted(set(range(1, 36)) - set(exclude_front))[:5], 'recommended_backs': sorted(set(range(1, 13)) - set(exclude_back))[:2], 'exclude_front': exclude_front, 'exclude_back': exclude_back } except Exception as analysis_error: logger.error("分析失败: %s", str(analysis_error), exc_info=True) raise def _handle_run_event(self, event: Event): """处理运行事件""" try: if event.target != self.module_id: logger.warning("目标模块不匹配: %s", event.target) return result = self.analyze(event.data) response = { "event_id": str(event.event_id), "status": "success", "data": { "recommended": { "front": result['recommended_fronts'], "back": result['recommended_backs'] }, "excluded": { "front": result['exclude_front'], "back": result['exclude_back'] } } } self._send_result(event, response) self._notify_ui(response) except Exception as handle_error: error_data = { "event_id": str(getattr(event, 'event_id', 0)), "status": "error", "message": str(handle_error) } self._notify_ui(error_data) logger.error("处理失败: %s", str(handle_error), exc_info=True) def _send_result(self, event: Event, result: Dict): """发送结果事件""" result_event = Event( event_id=str(event.event_id), type=str(EventType.ANALYSIS_RESULT), source=str(self.module_id), target=str(event.source), data={ "recommended_fronts": result['data']['recommended']['front'], "recommended_backs": result['data']['recommended']['back'], "exclude_front": result['data']['excluded']['front'], "exclude_back": result['data']['excluded']['back'] }, token=str(self.module_id) ) event_center.publish(result_event) def _notify_ui(self, data: Dict): """通知UI更新""" if not self._ui_callback: return try: if threading.current_thread() == threading.main_thread(): self._ui_callback(data) else: import tkinter as tk tk_root = tk.Tk() tk_root.after_idle(lambda: self._ui_callback(data)) except Exception as ui_error: logger.error("UI通知失败: %s", str(ui_error)) def submit_data(self, data: str, label: str = "输入分析"): """提交分析数据""" event = Event( event_id=str(uuid.uuid4()), type=str(EventType.DATA_SUBMIT), source=str(self.module_id), target='number_pool', data={"command": "run", "label": label, "data": data}, token=str(self.module_id) ) event_center.publish(event) if __name__ == "__main__": # 只在直接运行时实例化 module = InputAnalysisModule() def ui_handler(ui_data): print("\n=== UI更新 ===") print("状态:", ui_data.get("status")) if ui_data["status"] == "success": print("推荐号码:", ui_data["data"]["recommended"]) else: print("错误:", ui_data["message"]) print("=" * 30) module.register_ui_callback(ui_handler) test_event = Event( event_id=str(int(time.time())), type=str(EventType.MODULE_RUN), source="TEST", target="input_analysis", data={"exclude_front": "1,2,3", "exclude_back": [1]}, token="test_token" ) event_center.publish(test_event) time.sleep(1) # 必须导出的类(在文件末尾) __all__ = ['InputAnalysisModule']
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值