修改问题:未解析的引用 '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()
}
)