Numbers.app的使用

如何将.numbers 的文件转为Excel表格文件?

打开以.numbers 后缀的文件,在工具栏:文件 ------>导出------>选择需要导出的文件类型

修改问题:未解析的引用 '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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值