var_dump展示不全,出现省略号

本文介绍如何通过配置xdebug扩展来优化PHP中var_dump函数的输出结果,使其能够更清晰地展示复杂数组结构。

我们使用php的var_dump函数,可以更直观的查看输出结果,包括类型,数量等详细信息。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
但是在使用过程中,发现数组深度高,数组数量大等情况会出现省略号,这是什么原因呢。
原来php的var_dump是安装模块xdebug后的函数,这个模块可以配置其显示信息参数:

解决方法:
在php.ini里的xdebug节点中,追加一下配置:

1
2
3
4
5
 
xdebug.var_display_max_children=128
xdebug.var_display_max_data=512    
xdebug.var_display_max_depth=5  
 





上面代表的意思,就如代码命名这么直观:

1
2
3
4
5
 
xdebug.var_display_max_children // 最多孩子节点数
xdebug.var_display_max_data// 最大字节数
xdebug.var_display_max_depth// 最大深度
 





别忘了重启PHP服务..

根据自己显示的信息来配置吧。

强调:上面的代码是能够运行,现在修改,只是局部修改问题,要胡乱修改。。。修改时一定要说明在什么类的什么地方,这样要用户进行修改。找准位置,认真修改,本着用户至上的原则。生成完整代码。。。问题:1.主界面要求分成三栏,这里的设计是正确的,而子类界面咋出现的又是另一个界面,明明要求只有在动态区里是每个模块专用的,其它的区域给主界面是完一样。。。# ==================== 主界面修改 ==================== class MainInterface: def __init__(self, root: Tk, pool: NumberPool): self.root = root self.pool = pool self.left_panel = None self.center_frame = None self.right_panel = None self.core_vars = {} self.pool_vars = {} self.status_var = StringVar() self.dynamic_text = None self.current_module = None self._setup_ui() self._setup_event_handlers() self.module_instances = {} # 添加模块实例存储 self._init_modules() # 初始化所有模块 # 初始化排除号码相关控件 self.exclude_front_entries = [] self.exclude_back_entries = [] self.front_dan_entries = [] self.back_dan_entries = [] # 初始化结果文本控件 self.result_text = None # 初始化排除号码变量 self.exclude_front_var = StringVar() self.exclude_back_var = StringVar() self.recommend_front_var = StringVar() self.recommend_back_var = StringVar() # 初始化模块内容框架 self.dynamic_content = None self.module_content_frame = None self.labels = { 'InputAnalysis_analysis': [ "输入号码:" , "前区:" , "后区:" , "推荐号码:", "前区:" , "后区:", ], 'combination_analysis': [ "前区热号:", "前数字频:", "前频繁推:", "后区热号:", "后数字频:", "后低频推:" ], 'follow_analysis': [ "前推荐多:", "前推荐少:", "后推荐多:", "后推荐少:" ], 'trend_analysis': [ "和值:", "质合比:", "奇偶比:", "断区推荐:", "连号推荐:", "冷热推荐:", "后区热号:", "后区冷号:", "趋势号:" ], 'NumberGeneration_analysis': [ "胆码:" , "前区:" , "后区:", "推荐5注号码:", "1:" "", "2:" "", "3:" "", "4:" "", "5:" "" ], } # 初始化所有模块的条目引用 self.front_dan_entry = None self.back_dan_entry = None self.result_text = None self.exclude_front_entry = None self.exclude_back_entry = None self.front_entry = None self.back_entry = None def _focus_adjacent_entry(self, event, current_idx, offset, area): """移动焦点到相邻的输入框""" entries = self.front_exclude_entries if area == 'front' else self.back_exclude_entries new_idx = current_idx + offset if 0 <= new_idx < len(entries): entries[new_idx].focus_set() def _init_modules(self): """初始化所有分析模块""" modules = { 'input_analysis': InputAnalysisModule, 'combination_analysis': CombinationAnalysisModule, 'follow_analysis': FollowAnalysisModule, 'trend_analysis': TrendAnalysisModule, 'number_generation': NumberGenerationModule } for name, cls in modules.items(): self.module_instances[name] = cls(name) def _setup_event_handlers(self): """初始化事件处理器""" event_center.subscribe(EventType.MODULE_COMPLETE, self._handle_module_complete) event_center.subscribe(EventType.UI_UPDATE, self._handle_ui_update) event_center.subscribe(EventType.EXCLUDE_NUMBERS, self._handle_exclude_numbers) def _setup_ui(self): self.root.title(f"大乐透智能分析平台 - {GlobalConfig.VERSION}") self.root.geometry("1400x800") # 添加主标题(居中显示在最上面) title_frame = Frame(self.root) title_frame.pack(fill='x', pady=5) Label(title_frame, text="大乐透智能分析平台", font=('微软雅黑', 16, 'bold')).pack(expand=True) # 主容器 main_container = Frame(self.root) main_container.pack(fill='both', expand=True, padx=5, pady=(0, 5)) # 左侧面板 self.left_panel = Frame(main_container, width=200, bg="#eaeaea") self.left_panel.pack(side='left', fill='y', padx=(0, 5)) # 中间内容区 self.center_frame = Frame(main_container, width=400) self.center_frame.pack(side='left', fill='both', expand=True) # 右侧面板 self.right_panel = Frame(main_container, width=700, bg="#f5f5f5") self.right_panel.pack(side='right', fill='y') # 初始化各区域 self._setup_left_panel() self._setup_center_area() self._setup_right_panel() def _setup_left_panel(self): """初始化左侧模块按钮区""" module_names = { 'input_analysis': '1. 输入分析', 'combination_analysis': '2. 组合分析', 'follow_analysis': '3. 跟随分析', 'trend_analysis': '4. 趋势分析', 'number_generation': '5. 数字生成' } for module in GlobalConfig.MODULES: Button( self.left_panel, text=module_names[module], width=18, command=lambda m=module: self._on_module_button_click(m) ).pack(pady=3, padx=5, ipady=3) def _setup_center_area(self): """设置中间区域布局""" # 期号区 period_frame = Frame(self.center_frame, height=30, bd=1, relief='solid') period_frame.pack(fill='x', pady=(0, 5)) Label(period_frame, text="期号: ", font=('微软雅黑', 10)).pack(side='left') self.period_var = StringVar(value="2023001") Label(period_frame, textvariable=self.period_var, font=('微软雅黑', 10, 'bold')).pack(side='left') # 核心区 core_frame = Frame(self.center_frame, bd=1, relief='solid') core_frame.pack(fill='both', expand=True, pady=(0, 5)) # 核心区标题 Label(core_frame, text="核心区", font=('微软雅黑', 12, 'bold')).pack(anchor='w', padx=5, pady=2) # 核心数据展示 self.core_vars = { 'front_area': StringVar(), 'back_area': StringVar(), 'front_hot': StringVar(), 'front_cold': StringVar(), 'back_hot': StringVar(), 'back_cold': StringVar() } for label, var_name in [ ("前区:", 'front_area'), ("后区:", 'back_area'), ("前区热号:", 'front_hot'), ("前区冷号:", 'front_cold'), ("后区热号:", 'back_hot'), ("后区冷号:", 'back_cold') ]: frame = Frame(core_frame) frame.pack(fill='x', padx=5, pady=2) Label(frame, text=label, width=10, anchor='w').pack(side='left') # 添加容器Frame实现右边距2px entry_container = Frame(frame) entry_container.pack(side='left', fill='x', expand=True, padx=(0, 2)) entry = Entry(entry_container, textvariable=self.core_vars[var_name], font=('微软雅黑', 10), state='readonly', readonlybackground='#f0f0f0', relief='sunken', bd=1) entry.pack(fill='x', expand=True) # 动态区 dynamic_frame = Frame(self.center_frame, bd=1, relief='solid') dynamic_frame.pack(fill='both', expand=True) # 动态区标题框架 dynamic_header = Frame(dynamic_frame) dynamic_header.pack(fill='x', padx=5, pady=5) Label(dynamic_header, text="动态区", font=('微软雅黑', 12, 'bold')).pack(side='left') # 按钮框架(靠右) btn_frame = Frame(dynamic_header) btn_frame.pack(side='right') Button(btn_frame, text="运行", width=8, command=self._run_current_module).pack(side='left', padx=2) Button(btn_frame, text="清除", width=8, command=self._clear_dynamic_content).pack(side='left', padx=2) Button(btn_frame, text="保存", width=8, command=self._save_dynamic_content).pack(side='left', padx=2) Button(btn_frame, text="刷新", width=8, command=self._refresh_dynamic).pack(side='left', padx=2) # 模块内容容器 self.module_content_frame = Frame(dynamic_frame) self.module_content_frame.pack(fill='both', expand=True, padx=5, pady=5) def _run_current_module(self): """运行当前模块""" if self.current_module: self._run_module(self.current_module) def _clear_dynamic_content(self): """清除动态区内容""" if hasattr(self, 'result_text') and self.result_text: self.result_text.delete(1.0, 'end') def _save_dynamic_content(self): """保存动态区内容""" if hasattr(self, 'result_text') and self.result_text: content = self.result_text.get(1.0, 'end') with open('dynamic_content.txt', 'w', encoding='utf-8') as f: f.write(content) messagebox.showinfo("保存成功", "动态区内容已保存") def _refresh_dynamic(self): """刷新动态区""" if self.current_module: self._on_module_button_click(self.current_module) def _setup_right_panel(self): """设置右侧号码池布局""" # 号码池标题 pool_title_frame = Frame(self.right_panel) pool_title_frame.pack(fill='x', pady=5) Label(pool_title_frame, text="号码池", font=('微软雅黑', 12, 'bold')).pack(anchor='w') # 号码池内容区(添加边框和2px内边距) pool_content = Frame(self.right_panel, bd=1, relief='solid', padx=2, pady=2) pool_content.pack(fill='both', expand=True, padx=5, pady=5) # 创建Canvas和Scrollbar canvas = Canvas(pool_content, highlightthickness=0) scrollbar = Scrollbar(pool_content, orient="vertical", command=canvas.yview) scrollable_frame = Frame(canvas) scrollable_frame.bind( "<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")) ) canvas.create_window((0, 0), window=scrollable_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) # 号码池项目 - 优化布局和样式(带2px右边距) for label, var_name, row_id in GlobalConfig.UI_CONFIG: frame = Frame(scrollable_frame) frame.grid(row=row_id, column=0, sticky='ew', padx=0, pady=1) # 移除水平padding # 左侧标签(固定宽度8字符) lbl = Label(frame, text=label, width=8, anchor='w') lbl.pack(side='left', padx=(0, 5)) # 标签右侧留5px间距 # 右侧输入框容器(带2px右边距) entry_container = Frame(frame) entry_container.pack(side='left', fill='x', expand=True, padx=(0, 2)) var = StringVar() self.pool_vars[var_name] = var entry = Entry(entry_container, textvariable=var, font=('微软雅黑', 9), state='readonly', readonlybackground='#f0f0f0', relief='sunken', bd=1) entry.pack(fill='x', expand=True) canvas.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") # 底部按钮区 btn_frame = Frame(self.right_panel) btn_frame.pack(fill='x', pady=5) Button(btn_frame, text="整理", width=10, command=self._organize_data).pack(side='left', padx=5) Button(btn_frame, text="冻结", width=10, command=self._freeze_data).pack(side='left', padx=5) Button(btn_frame, text="导出", width=10).pack(side='left', padx=5) def _organize_data(self): """整理号码池数据""" organize_event = Event( event_id=int(time.time()), type=EventType.DATA_ORGANIZE, source='main_ui', target='pool' ) event_center.publish(organize_event) def _freeze_data(self): """冻结号码池数据""" freeze_event = Event( event_id=int(time.time()), type=EventType.DATA_FREEZE, source='main_ui', target='pool' ) event_center.publish(freeze_event) def _on_module_button_click(self, module: str): """完重构的模块显示方法 - 嵌入主界面动态区""" self.status_var.set(f"打开 {module} 模块...") self.current_module = module # 清除之前的动态内容 if self.dynamic_content: self.dynamic_content.destroy() # 创建模块专属容器 self.dynamic_content = Frame(self.module_content_frame) self.dynamic_content.pack(fill='both', expand=True, padx=5, pady=5) # 顶部模块标签区 top_label_frame = Frame(self.dynamic_content) top_label_frame.pack(fill='x', pady=5) module_labels = { 'input_analysis': '1. 输入分析', 'combination_analysis': '2. 组合分析', 'follow_analysis': '3. 跟随分析', 'trend_analysis': '4. 趋势分析', 'number_generation': '5. 数字生成' } Label(top_label_frame, text=module_labels.get(module, module), font=('微软雅黑', 14, 'bold')).pack() # 内容区容器 content_frame = Frame(self.dynamic_content, bd=1, relief='solid') content_frame.pack(fill='both', expand=True, padx=5, pady=5) # 根据模块类型创建特定内容 if module == "input_analysis": self._create_input_analysis_content(content_frame) elif module == "combination_analysis": self._create_combination_analysis_content(content_frame) elif module == "follow_analysis": self._create_follow_analysis_content(content_frame) elif module == "trend_analysis": self._create_trend_analysis_content(content_frame) elif module == "number_generation": self._create_number_generation_content(content_frame) # 底部按钮区 bottom_frame = Frame(self.dynamic_content) bottom_frame.pack(pady=5, fill='x') Button(bottom_frame, text="运行", command=lambda: self._run_module(module)).pack(side='left', padx=5) Button(bottom_frame, text="清除", command=lambda: self._clear_module_data(module)).pack(side='left', padx=5) Button(bottom_frame, text="保存", command=lambda: self._save_module_data(module)).pack(side='left', padx=5) Button(bottom_frame, text="刷新", command=lambda: self._on_module_renovate(module)).pack(side='right', padx=5) def _create_ui_element(self, parent, label_text): """创建统一的UI元素(带右边距2px)""" frame = Frame(parent) frame.pack(fill='x', pady=2) # 标签固定宽度 Label(frame, text=label_text, width=12, anchor='w').pack(side='left') # 添加容器Frame实现右边距2px entry_container = Frame(frame) entry_container.pack(side='left', fill='x', expand=True, padx=(0, 2)) return entry_container def _create_input_analysis_content(self, parent: Frame): """创建输入分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) # 排除号码区 exclude_frame = Frame(content_frame) exclude_frame.pack(fill='x', pady=5) # 排除号码标签 Label(exclude_frame, text="排除号码:", font=('微软雅黑', 10, 'bold')).pack(anchor='w', pady=5) # 前区排除号码 front_exclude_frame = Frame(exclude_frame) front_exclude_frame.pack(fill='x', pady=2) Label(front_exclude_frame, text="前区:", width=5, anchor='w').pack(side='left') self.exclude_front_entry = Entry(front_exclude_frame) self.exclude_front_entry.pack(side='left', fill='x', expand=True) # 后区排除号码 back_exclude_frame = Frame(exclude_frame) back_exclude_frame.pack(fill='x', pady=2) Label(back_exclude_frame, text="后区:", width=5, anchor='w').pack(side='left') self.exclude_back_entry = Entry(back_exclude_frame) self.exclude_back_entry.pack(side='left', fill='x', expand=True) # 号码输入区 input_frame = Frame(content_frame) input_frame.pack(fill='x', pady=5) Label(input_frame, text="输入号码:", font=('微软雅黑', 10, 'bold')).pack(anchor='w', pady=5) # 前区号码 front_frame = Frame(input_frame) front_frame.pack(fill='x', pady=2) Label(front_frame, text="前区:", width=5, anchor='w').pack(side='left') self.front_entry = Entry(front_frame) self.front_entry.pack(side='left', fill='x', expand=True) # 后区号码 back_frame = Frame(input_frame) back_frame.pack(fill='x', pady=2) Label(back_frame, text="后区:", width=5, anchor='w').pack(side='left') self.back_entry = Entry(back_frame) self.back_entry.pack(side='left', fill='x', expand=True) # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True, pady=5) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.result_text.pack(fill='both', expand=True) scrollbar.config(command=self.result_text.yview) def _create_combination_analysis_content(self, parent: Frame): """创建组合分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) # 使用预定义的labels for label in self.labels['combination_analysis']: frame = Frame(content_frame) frame.pack(fill='x', pady=2) Label(frame, text=label, width=12, anchor='w', font=('微软雅黑', 10, 'bold')).pack(side='left') entry = Entry(frame, width=30, state='readonly', readonlybackground='#f0f0f0') entry.pack(side='left', padx=5) # 保存对控件的引用 var_name = label.replace(':', '').replace(' ', '_') setattr(self, f"{var_name}_entry", entry) # 直接保存到实例变量 if var_name == "front_hot": self.front_hot_entry = entry elif var_name == "front_freq": self.front_freq_entry = entry elif var_name == "front_freq_rec": self.front_freq_rec_entry = entry elif var_name == "back_hot": self.back_hot_entry = entry elif var_name == "back_freq": self.back_freq_entry = entry elif var_name == "back_infreq_rec": self.back_infreq_rec_entry = entry # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.result_text.pack(fill='both', expand=True) scrollbar.config(command=self.result_text.yview) def _create_follow_analysis_content(self, parent: Frame): """创建跟随分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) for label in self.labels['follow_analysis']: frame = Frame(content_frame) frame.pack(fill='x', pady=2) Label(frame, text=label, width=12, anchor='w', font=('微软雅黑', 10, 'bold')).pack(side='left') entry = Entry(frame, width=30, state='readonly', readonlybackground='#f0f0f0') entry.pack(side='left', padx=5) var_name = label.replace(':', '').replace(' ', '_') setattr(self, f"{var_name}_entry", entry) # 直接保存到实例变量 if var_name == "front_more": self.front_more_entry = entry elif var_name == "front_less": self.front_less_entry = entry elif var_name == "back_more": self.back_more_entry = entry elif var_name == "back_less": self.back_less_entry = entry # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.result_text.pack(fill='both', expand=True) scrollbar.config(command=self.result_text.yview) def _create_trend_analysis_content(self, parent: Frame): """创建趋势分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) for label in self.labels['trend_analysis']: frame = Frame(content_frame) frame.pack(fill='x', pady=2) Label(frame, text=label, width=12, anchor='w', font=('微软雅黑', 10, 'bold')).pack(side='left') entry = Entry(frame, width=30, state='readonly', readonlybackground='#f0f0f0') entry.pack(side='left', padx=5) var_name = label.replace(':', '').replace(' ', '_') setattr(self, f"{var_name}_entry", entry) # 直接保存到实例变量 if var_name == "sum_value": self.sum_value_entry = entry elif var_name == "prime_ratio": self.prime_ratio_entry = entry elif var_name == "odd_even_ratio": self.odd_even_ratio_entry = entry elif var_name == "zone_rec": self.zone_rec_entry = entry elif var_name == "consec_rec": self.consec_rec_entry = entry elif var_name == "hot_cold_rec": self.hot_cold_rec_entry = entry elif var_name == "hot_rec": self.hot_rec_entry = entry elif var_name == "cold_rec": self.cold_rec_entry = entry elif var_name == "trend_rec": self.trend_rec_entry = entry # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.result_text.pack(fill='both', expand=True) scrollbar.config(command=self.result_text.yview) def _create_number_generation_content(self, parent: Frame): """创建数字生成模块的动态内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) # 胆码输入区 dan_frame = Frame(content_frame) dan_frame.pack(fill='x', pady=5) # 前区胆码 front_dan_frame = Frame(dan_frame) front_dan_frame.pack(fill='x') Label(front_dan_frame, text="前区胆码:").pack(side='left') self.front_dan_entries = [] for i in range(5): entry = Entry(front_dan_frame, width=3) entry.pack(side='left', padx=2) self.front_dan_entries.append(entry) self.front_dan_entry = self.front_dan_entries[0] # 保存第一个条目引用 # 后区胆码 back_dan_frame = Frame(dan_frame) back_dan_frame.pack(fill='x') Label(back_dan_frame, text="后区胆码:").pack(side='left') self.back_dan_entries = [] for i in range(5): entry = Entry(back_dan_frame, width=3) entry.pack(side='left', padx=2) self.back_dan_entries.append(entry) self.back_dan_entry = self.back_dan_entries[0] # 保存第一个条目引用 # 生成的号码显示区 generated_frame = Frame(content_frame) generated_frame.pack(fill='x', pady=5) Label(generated_frame, text="生成号码:").pack(anchor='w') self.generated_labels = [] for i in range(1, 6): frame = Frame(generated_frame) frame.pack(fill='x') Label(frame, text=f"{i}.").pack(side='left') label = Label(frame, text="", width=30, anchor='w') label.pack(side='left') self.generated_labels.append(label) # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.result_text.pack(fill='both', expand=True) scrollbar.config(command=self.result_text.yview) def _run_module(self, module: str): """运行模块""" if module == "input_analysis": # 获取排除号码 exclude_front = self.exclude_front_entry.get() exclude_back = self.exclude_back_entry.get() # 发布排除号码事件 exclude_event = Event( event_id=int(time.time()), type=EventType.EXCLUDE_NUMBERS, source='main_ui', target='pool', data={ 'exclude_front': exclude_front, 'exclude_back': exclude_back } ) event_center.publish(exclude_event) # 在结果文本中记录 self.result_text.insert('end', f"已设置排除号码: 前区 {exclude_front}, 后区 {exclude_back}\n") # 发布模块运行事件 run_event = Event( event_id=int(time.time()), type=EventType.MODULE_RUN, source='main_ui', target=module ) event_center.publish(run_event) def _generate_recommend_numbers(self, exclude_front: str, exclude_back: str): """生成推荐号码(示例逻辑)""" # 实际应用中应调用分析模块生成推荐号码 # 这里简化为生成随机推荐号码 import random # 前区号码范围1-35 all_front = [str(idx) for idx in range(1, 36)] exclude_front_list = exclude_front.split() if exclude_front else [] available_front = [num for num in all_front if num not in exclude_front_list] # 后区号码范围1-12 all_back = [str(idx) for idx in range(1, 13)] exclude_back_list = exclude_back.split() if exclude_back else [] available_back = [num for num in all_back if num not in exclude_back_list] # 随机选择5个前区号码 if len(available_front) >= 5: recommend_front = random.sample(available_front, 5) else: recommend_front = random.sample(all_front, 5) # 随机选择2个后区号码 if len(available_back) >= 2: recommend_back = random.sample(available_back, 2) else: recommend_back = random.sample(all_back, 2) # 更新推荐号码显示 self.recommend_front_var.set(' '.join(sorted(recommend_front, key=int))) self.recommend_back_var.set(' '.join(sorted(recommend_back, key=int))) # 在结果文本中记录 self.result_text.insert('end', f"生成推荐号码: 前区 {self.recommend_front_var.get()}, 后区 {self.recommend_back_var.get()}\n") # 更新号码池 self._update_pool_with_recommendations(self.recommend_front_var.get(), self.recommend_back_var.get()) def _update_pool_with_recommendations(self, front: str, back: str): """用推荐号码更新号码池""" # 发布事件更新号码池 update_event = Event( event_id=int(time.time()), type=EventType.POOL_UPDATE, source='input_analysis', target='pool', data={ 'front_numbers': front, 'back_numbers': back } ) event_center.publish(update_event) # 在结果文本中记录 self.result_text.insert('end', "号码池已更新\n") def _clear_module_data(self, module: str): """清除模块数据""" if module == "input_analysis": if hasattr(self, 'front_entry') and self.front_entry: self.front_entry.delete(0, 'end') if hasattr(self, 'back_entry') and self.back_entry: self.back_entry.delete(0, 'end') if hasattr(self, 'exclude_front_entry') and self.exclude_front_entry: self.exclude_front_entry.delete(0, 'end') if hasattr(self, 'exclude_back_entry') and self.exclude_back_entry: self.exclude_back_entry.delete(0, 'end') if hasattr(self, 'recommend_front_var'): self.recommend_front_var.set('') if hasattr(self, 'recommend_back_var'): self.recommend_back_var.set('') if hasattr(self, 'result_text') and self.result_text: self.result_text.delete(1.0, 'end') elif module == "combination_analysis": if hasattr(self, 'front_hot_entry') and self.front_hot_entry: self.front_hot_entry.delete(0, 'end') if hasattr(self, 'front_freq_entry') and self.front_freq_entry: self.front_freq_entry.delete(0, 'end') if hasattr(self, 'front_freq_rec_entry') and self.front_freq_rec_entry: self.front_freq_rec_entry.delete(0, 'end') if hasattr(self, 'back_hot_entry') and self.back_hot_entry: self.back_hot_entry.delete(0, 'end') if hasattr(self, 'back_freq_entry') and self.back_freq_entry: self.back_freq_entry.delete(0, 'end') if hasattr(self, 'back_infreq_rec_entry') and self.back_infreq_rec_entry: self.back_infreq_rec_entry.delete(0, 'end') if hasattr(self, 'result_text') and self.result_text: self.result_text.delete(1.0, 'end') def _save_module_data(self, module: str): """保存模块数据""" try: data = {} if module == "input_analysis": data['front'] = self.front_entry.get() data['back'] = self.back_entry.get() data['exclude_front'] = self.exclude_front_entry.get() data['exclude_back'] = self.exclude_back_entry.get() data['recommend_front'] = self.recommend_front_var.get() data['recommend_back'] = self.recommend_back_var.get() data['result'] = self.result_text.get(1.0, 'end') elif module == "combination_analysis": data['front_hot'] = self.front_hot_entry.get() data['front_freq'] = self.front_freq_entry.get() data['front_freq_rec'] = self.front_freq_rec_entry.get() data['back_hot'] = self.back_hot_entry.get() data['back_freq'] = self.back_freq_entry.get() data['back_infreq_rec'] = self.back_infreq_rec_entry.get() data['result'] = self.result_text.get(1.0, 'end') # 其他模块数据收集... filename = f"{module}_data.json" with open(filename, 'w', encoding='utf-8') as f: json.dump(data, f, indent=2, ensure_ascii=False) messagebox.showinfo("保存成功", f"数据已保存到{filename}") except Exception as e: messagebox.showerror("保存失败", str(e)) logging.error(f"保存数据失败: {str(e)}", exc_info=True) def _handle_exclude_numbers(self, event: Event): """处理排除号码事件""" if event.data: exclude_front = event.data.get('exclude_front', '') exclude_back = event.data.get('exclude_back', '') # 更新排除号码显示 self.exclude_front_entry.delete(0, 'end') self.exclude_front_entry.insert(0, exclude_front) self.exclude_back_entry.delete(0, 'end') self.exclude_back_entry.insert(0, exclude_back) # 在结果文本中记录 self.result_text.insert('end', f"收到排除号码: 前区 {exclude_front}, 后区 {exclude_back}\n") def _handle_module_complete(self, event: Event): self.status_var.set(f"{event.source} 模块运行完成") if hasattr(self, 'result_text') and self.result_text: self.result_text.insert('end', f"\n{event.source} 模块已完成分析\n") def _on_module_renovate(self, module: str): """刷新模块""" if module == self.current_module: self._on_module_button_click(module) def _handle_ui_update(self, event: Event): """处理UI更新事件""" if not event.data or 'update_type' not in event.data: return update_type = event.data['update_type'] data = event.data.get('data', {}) # 处理核心变量更新 if update_type == 'organized_data': # 确保所有核心变量已初始化 if not hasattr(self, 'core_vars'): self.core_vars = { 'front_area': StringVar(), 'back_area': StringVar(), 'front_hot': StringVar(), 'front_cold': StringVar(), 'back_hot': StringVar(), 'back_cold': StringVar() } # 更新界面变量 self.core_vars['front_area'].set(str(data.get('front_numbers', []))) self.core_vars['back_area'].set(str(data.get('back_numbers', []))) self.core_vars['front_hot'].set(str(data.get('front_hot', []))) self.core_vars['front_cold'].set(str(data.get('front_cold', []))) self.core_vars['back_hot'].set(str(data.get('back_hot', []))) self.core_vars['back_cold'].set(str(data.get('back_cold', [])))
07-16
修改问题:未解析的引用 'TrendAnalysisModule',未解析的引用 'NumberGenerationModule',未解析的引用 'TrendAnalysisModule',未解析的引用 'NumberGenerationModule',未解析的引用 'Label',未解析的引用 'time',未解析的引用 'os'未解析的引用 'os'未解析的引用 'os'未解析的引用 'os'未解析的引用 'filename'未解析的引用 'filename'未解析的引用 'data'未解析的引用 'data',未解析的引用 'StringVar'未解析的引用 'StringVar'未解析的引用 'StringVar'未解析的引用 'StringVar'未解析的引用 'Frame'未解析的引用 'Frame'未解析的引用 'Frame'类 'MainInterface' 的未解析的特性引用 '_setup_main_window',类 'MainInterface' 的未解析的特性引用 '_setup_main_window'类 'MainInterface' 的未解析的特性引用 '_setup_left_panel',类 'MainInterface' 的未解析的特性引用 '_setup_center_area',类 'MainInterface' 的未解析的特性引用 '_setup_right_panel',,形参 'module_config' 未填,类 'MainInterface' 的未解析的特性引用 '_setup_main_window',类 'MainInterface' 的未解析的特性引用 '_setup_left_panel',类 'MainInterface' 的未解析的特性引用 '_setup_center_area',类 'MainInterface' 的未解析的特性引用 '_setup_right_panel',代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import tkinter as tk import datetime import pandas as pd import logging from pathlib import Path from typing import Dict, Any, Callable 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 # 配置日志记录器 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) class MainInterface: def __init__(self, root_window: tk.Tk, number_pool: NumberPool): self.root = root_window self.pool = number_pool self.app = app_context self._callbacks: Dict[str, Callable] = {} self._dynamic_content: Dict[str, Any] = {} self._module_states: Dict[str, Dict] = {} self.DEBUG_MODE = False # 添加DEBUG_MODE属性 self._init_ui_components() # 初始化UI组件 self._init_modules() # 初始化模块系统 self._init_default_dynamic_content() # 初始化动态内容 # 初始化事件中心 self.app.event_center = GlobalConfig.init_event_center() # 初始化UI变量 self._init_ui_variables() # 创建主容器 self.main_frame = tk.Frame(root_window) self.main_frame.pack(fill=tk.BOTH, expand=True) # 初始化UI组件 self._init_ui_components() # 初始化动态内容 self._init_default_dynamic_content() # 初始化所有模块 self._init_modules() # 恢复模块状态 self.restore_module_state() # 设置应用引用 app_context.dialog_manager = DialogManager() app_context.main_ui = self def _init_ui_components(self): """初始化所有UI组件""" self._setup_main_window() self._setup_left_panel() self._setup_center_area() self._setup_right_panel() logger.info("UI组件初始化完成") # 标题栏 self.title_label = tk.Label( self.main_frame, text=GlobalConfig.VERSION, font=("Arial", 16, "bold") ) # 主内容区域 self.content_frame = tk.Frame(self.main_frame) # 状态栏 self.status_bar = tk.Label( self.main_frame, text="就绪", bd=1, relief=tk.SUNKEN, anchor=tk.W ) # 布局组件 self.title_label.pack(pady=10) self.content_frame.pack(fill=tk.BOTH, expand=True) self.status_bar.pack(fill=tk.X) def _init_default_dynamic_content(self): """初始化默认动态内容""" self._dynamic_content = { 'recommendations': {'front': [], 'back': []}, 'analysis_results': {}, 'module_buttons': {} } def restore_module_state(self): """从配置文件恢复模块状态""" try: # 使用正确的配置路径获取方法 state_file = GlobalConfig.CONFIG_PATHS.get('MODULE_STATE', 'module_state.json') if Path(state_file).exists(): with open(state_file, 'r', encoding='utf-8') as f: self._module_states = json.load(f) logger.info("成功恢复模块状态") except Exception as e: logger.error(f"恢复模块状态失败: {e}") def _update_pool_with_recommendations(self): """用推荐数据更新号码池""" if not self._dynamic_content.get('recommendations'): return front_rec = self._dynamic_content['recommendations'].get('front', []) back_rec = self._dynamic_content['recommendations'].get('back', []) if front_rec or back_rec: self.pool.update({ 'front_numbers': front_rec, 'back_numbers': back_rec }) logger.info("号码池已更新推荐号码") def register_callback(self, event_type: str, callback: Callable) -> None: """注册回调函数""" self._callbacks[event_type] = callback def _init_modules(self): """初始化模块系统""" self.modules = { GlobalConfig.MODULE1_ID: InputAnalysisModule(), GlobalConfig.MODULE2_ID: CombinationAnalysisModule(), GlobalConfig.MODULE3_ID: FollowAnalysisModule(), GlobalConfig.MODULE4_ID: TrendAnalysisModule(), GlobalConfig.MODULE5_ID: NumberGenerationModule() } logger.info("模块系统初始化完成") self.module_content_frame = tk.Frame(self.main_frame) self.module_content_frame.pack(fill=tk.BOTH, expand=True) # 模块初始化函数 - 修复参数传递问题 def init_module(module_class, module_id, extra_params=None): # 创建模块配置对象 config = { 'module_id': module_id, 'labels': GlobalConfig.get_module_labels(module_id) } # 合并额外参数 if extra_params: config.update(extra_params) # 直接传递整个配置对象,而是拆分为关键字参数 module = module_class(module_config=config) self._register_module_callback( module, "analysis_result", self._handle_analysis_result ) return module # 模块1: 输入分析 self.module1 = init_module(InputAnalysisModule, GlobalConfig.MODULE1_ID) # 模块2: 组合分析 self.module2 = init_module( CombinationAnalysisModule, GlobalConfig.MODULE2_ID, {'event_center': self.app.event_center} ) # 模块3: 跟随分析 self.module3 = init_module(FollowAnalysisModule, GlobalConfig.MODULE3_ID) # 模块4: 趋势分析 self.module4 = init_module( TrendAnalyzer, GlobalConfig.MODULE4_ID, { 'df': pd.DataFrame(), 'event_center': self.app.event_center, 'event_handlers': { 'run_analysis': self._handle_run_analysis, 'get_results': self._handle_get_results } } ) # 模块5: 数字生成 self.module5 = init_module(NumberGenerator, GlobalConfig.MODULE5_ID) # 保存模块引用 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, event_type: str, callback: Callable) -> None: """统一注册模块回调""" if hasattr(module, 'register_callback'): module.register_callback(event_type, callback) else: logger.warning(f"模块 {type(module).__name__} 没有 register_callback 方法") def _handle_run_analysis(self, event_data: Dict[str, Any]) -> None: """处理运行分析请求""" self._execute_analysis(event_data, self.module1.analyze) def _handle_get_results(self, event_data: Dict[str, Any]) -> Dict[str, Any]: """处理获取结果请求""" return self._process_results_request(event_data) def _execute_analysis(self, event_data, analyzer_func): """通用分析执行函数""" if not isinstance(event_data, dict): logger.error("无效的事件数据格式") return token = event_data.get('token') params = event_data.get('params', {}) logger.info(f"收到运行分析请求,token: {token}, 参数: {params}") try: front_nums = self._parse_numbers(self.front_var.get()) back_nums = self._parse_numbers(self.back_var.get()) data = { 'front_numbers': front_nums, 'back_numbers': back_nums, 'config': self._get_ui_config_values() } analysis_result = analyzer_func(data=data) 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 _parse_numbers(self, number_str: str) -> list: """解析数字字符串""" return [int(x) for x in number_str.split(",") if x.strip()] def _process_results_request(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 = {"status": "success", "data": "示例结果数据"} 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}") 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 _get_ui_config_values(self) -> Dict[str, str]: """获取UI配置值""" config_values = {} for _, var_name, _ in GlobalConfig.UI_CONFIG: if hasattr(self, f"{var_name}_var"): config_values[var_name] = getattr(self, f"{var_name}_var").get() return config_values def _init_ui_variables(self): """初始化UI变量""" self.front_var = tk.StringVar() self.back_var = tk.StringVar() self.trend_var = tk.StringVar() 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) # 创建按钮 self._create_action_buttons() def _create_action_buttons(self): """创建操作按钮""" 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): """处理分析按钮点击""" self._execute_analysis( {'token': 'manual_analysis'}, self.module1.analyze ) def _save_config(self): """保存当前配置""" try: config_data = self._get_ui_config_values() save_path = GlobalConfig.CONFIG_PATHS.get('MODULE1_SAVE', 'module1_config.json') 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) logger.info(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: logger.error(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, result_data: dict): """处理分析结果""" logger.info(f"收到分析结果: {result_data}") if "front" in result_data: self.front_var.set(",".join(map(str, result_data["front"]))) if "back" in result_data: self.back_var.set(",".join(map(str, result_data["back"]))) # 更新动态内容中的推荐数据 if 'recommendations' in result_data: self._dynamic_content['recommendations'] = result_data['recommendations'] self._update_pool_with_recommendations() 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() } ) def main(): """主函数入口""" root_window = tk.Tk() root_window.title("大乐透智能分析平台") root_window.geometry("1000x700+100+100") # 初始化事件中心 event_center = EventCenter() # 初始化号码池 number_pool = NumberPool( front_range=(1, 35), back_range=(1, 12), event_center=event_center ) # 创建主界面 MainInterface(root_window, number_pool) # 运行主循环 root_window.mainloop() if __name__ == "__main__": main() class MainInterface: def __init__(self, root: tk.Tk, pool: 'NumberPool'): # ... [其他初始化代码] ... # 添加缺失的初始化 self.DEBUG_MODE = False # 添加DEBUG_MODE属性 self._init_ui_components() # 初始化UI组件 self._init_modules() # 初始化模块系统 self._init_default_dynamic_content() # 初始化动态内容 # ... [其他初始化代码] ... def _init_ui_components(self): """初始化UI组件""" self._setup_main_window() self._setup_left_panel() self._setup_center_area() self._setup_right_panel() logger.info("UI组件初始化完成") def _init_modules(self): """初始化模块系统""" self.modules = { GlobalConfig.MODULE1_ID: InputAnalysisModule(), GlobalConfig.MODULE2_ID: CombinationAnalysisModule(), GlobalConfig.MODULE3_ID: FollowAnalysisModule(), GlobalConfig.MODULE4_ID: TrendAnalysisModule(), GlobalConfig.MODULE5_ID: NumberGenerationModule() } logger.info("模块系统初始化完成") def _init_default_dynamic_content(self): """初始化默认动态区内容""" if hasattr(self, 'module_content_frame'): Label(self.module_content_frame, text="请从左侧选择分析模块", font=('微软雅黑', 12)).pack(expand=True, pady=50) def save_module_state(self, module_id: str): """保存模块状态(示例实现)""" state_file = f"module_{module_id}_state.json" with open(state_file, 'w') as f: json.dump({"last_used": time.time()}, f) logger.info(f"模块状态已保存: {module_id}") def restore_module_state(self, module_id: str): """恢复模块状态(示例实现)""" state_file = f"module_{module_id}_state.json" if os.path.exists(state_file): with open(state_file, 'r') as f: state = json.load(f) logger.info(f"恢复模块状态: {module_id} - {state}") def _update_pool_with_recommendations(self, front: str, back: str): """使用推荐号码更新号码池""" self.pool.update("前区:", front.split()) self.pool.update("后区:", back.split()) logger.info(f"号码池已更新: 前区={front}, 后区={back}") # 修复文件操作类型错误 def _save_module_data(self, module: str): try: # ... [其他代码] ... # 确保目录存在 os.makedirs(os.path.dirname(filename), exist_ok=True) # 使用正确的文件打开方式 with open(filename, 'w', encoding='utf-8') as f: json.dump(data, f, indent=2, ensure_ascii=False) # ... [其他代码] ... # 移除重复声明的方法(只保留一个实现) # 保留以下方法实现: def _create_input_analysis_content(self, parent: Frame): # 具体实现... def _create_combination_analysis_content(self, parent: Frame): # 具体实现... # 移除其他重复声明 # 初始化未解析的UI组件 def _create_follow_analysis_content(self, parent: Frame): # ... [具体实现] ... # 初始化缺失的UI组件引用 self.front_recommend_more = StringVar() self.front_recommend_less = StringVar() self.back_recommend_more = StringVar() self.back_recommend_less = StringVar() # ... [其他代码] ... def _create_trend_analysis_content(self, parent: Frame): # ... [具体实现] ... # 初始化缺失的UI组件引用 self.hezhi_entry = Entry() self.zhihebi_entry = Entry() # 初始化其他缺失的entry... # ... [其他代码] ...
08-26
修改:意外实参,形参 'event_type' 未填,意外实参,形参 'event_type' 未填,意外实参,形参 'event_type' 未填,,意外实参,形参 'event_type' 未填,类 'FollowAnalysisModule' 的未解析的特性引用 '_submit_data'意外实参,形参 'event_type' 未填,类 'TrendAnalysisModule' 的未解析的特性引用 '_submit_data',意外实参,形参 'event_type' 未填,类 'NumberGenerationModule' 的未解析的特性引用 '_submit_data',意外实参,形参 'event_type' 未填,,意外实参,形参 'event_type' 未填,,意外实参,形参 'event_type' 未填,,意外实参,形参 'event_type' 未填,,意外实参,形参 'event_type' 未填,,意外实参,形参 'event_type' 未填,未解析的引用 'available_fronts',未解析的引用 'available_backs'代码# ====== 号码池类 ====== class NumberPool: def __init__(self): self.data_store = { 'front_hot': [], 'back_hot': [], 'front_freq': {}, 'back_freq': {}, 'front_missing': [], 'back_missing': [], 'recommendations': {}, 'generated_numbers': [], 'frozen': False, 'front_numbers': [], 'back_numbers': [], 'special_data': {}, 'organized_data': None } self.lock = threading.Lock() self.current_module = None self.module_status = {module: False for module in GlobalConfig.MODULES} self.running = True self._setup_subscriptions() self._load_data() def _setup_subscriptions(self): """设置事件订阅""" event_center.subscribe(EventType.DATA_SUBMIT.value, self._handle_data_submit) event_center.subscribe(EventType.MODULE_READY.value, self._handle_module_ready) event_center.subscribe(EventType.MODULE_COMPLETE.value, self._handle_module_complete) event_center.subscribe(EventType.DATA_FREEZE.value, self._handle_freeze) event_center.subscribe(EventType.DATA_ORGANIZE.value, self._handle_organize) event_center.subscribe(EventType.MODULE_RUN.value, self._handle_module_run) event_center.subscribe(EventType.EXCLUDE_NUMBERS.value, self._handle_exclude_numbers) def _handle_data_submit(self, event): """处理数据提交事件""" if event.target == 'pool' and not self.data_store['frozen']: with self.lock: self.data_store.update(event.data or {}) self._save_data() def _handle_exclude_numbers(self, event): """处理排除号码事件""" if event.data: exclude_front = event.data.get('exclude_front', '').split() exclude_back = event.data.get('exclude_back', '').split() self.data_store['excluded_front'] = [int(x) for x in exclude_front if x.isdigit()] self.data_store['excluded_back'] = [int(x) for x in exclude_back if x.isdigit()] logging.info(f"更新排除号码: 前区 {exclude_front}, 后区 {exclude_back}") def _handle_module_ready(self, event): """处理模块就绪事件""" if event.target == 'pool': logging.info(f"模块 {event.source} 已就绪") def _handle_module_complete(self, event): """处理模块完成事件""" if event.target == 'pool': logging.info(f"模块 {event.source} 已完成运行") self.module_status[event.source] = False self.current_module = None def _handle_freeze(self, event): """处理数据冻结事件""" if event.target == 'pool': with self.lock: self.data_store['frozen'] = True logging.info("号码池数据已冻结") def _handle_organize(self, event): """处理数据整理事件""" if event.target == 'pool': with self.lock: self._organize_data() logging.info("号码池数据已整理") update_event = Event( event_id=int(time.time()), type=EventType.UI_UPDATE.value, source='pool', target='main_ui', data={'update_type': 'organized_data', 'data': self.data_store['organized_data']} ) event_center.publish(update_event) def _organize_data(self): """整理号码池数据到核心展示区""" organized = { 'front_numbers': self._organize_front_numbers(), 'back_numbers': self._organize_back_numbers(), 'front_hot': self._organize_front_hot(), 'front_cold': self._organize_front_cold(), 'back_hot': self._organize_back_hot(), 'back_cold': self._organize_back_cold() } self.data_store['organized_data'] = organized return organized def _organize_front_numbers(self): """整理前区号码""" front_numbers = self.data_store.get('front_numbers', []) uncombined = self.data_store.get('recommendations', {}).get('uncombined', []) return sorted(list(set(front_numbers + uncombined))) def _organize_back_numbers(self): """整理后区号码""" return self.data_store.get('back_numbers', []) def _organize_front_hot(self): """整理前区热号""" front_freq = list(self.data_store.get('front_freq', {}).keys()) front_freq_rec = self.data_store.get('recommendations', {}).get('front_freq_50', []) front_rec_more = self.data_store.get('recommendations', {}).get('front_rec_more', []) hot_cold_rec = self.data_store.get('recommendations', {}).get('hot_cold_rec', {}).get('hot', []) hot_numbers = list(set( [int(x) for x in front_freq] + front_freq_rec + front_rec_more + hot_cold_rec )) return sorted(hot_numbers) def _organize_front_cold(self): """整理前区冷号""" front_missing = self.data_store.get('front_missing', []) front_rec_less = self.data_store.get('recommendations', {}).get('front_rec_less', []) hot_cold_rec = self.data_store.get('recommendations', {}).get('hot_cold_rec', {}).get('cold', []) cold_numbers = list(set( front_missing + front_rec_less + hot_cold_rec )) return sorted(cold_numbers) def _organize_back_hot(self): """整理后区热号""" back_freq = list(self.data_store.get('back_freq', {}).keys()) back_rec_more = self.data_store.get('recommendations', {}).get('back_rec_more', []) hot_rec = self.data_store.get('recommendations', {}).get('hot_rec', []) hot_numbers = list(set( [int(x) for x in back_freq] + back_rec_more + hot_rec )) return sorted(hot_numbers) def _organize_back_cold(self): """整理后区冷号""" back_missing = self.data_store.get('back_missing', []) back_infreq_rec = self.data_store.get('recommendations', {}).get('back_infreq_50', []) back_rec_less = self.data_store.get('recommendations', {}).get('back_rec_less', []) cold_rec = self.data_store.get('recommendations', {}).get('cold_rec', []) cold_numbers = list(set( back_missing + back_infreq_rec + back_rec_less + cold_rec )) return sorted(cold_numbers) def _handle_module_run(self, event): """处理模块运行事件""" if event.target == 'pool' and event.source in GlobalConfig.MODULES: self.current_module = event.source self.module_status[event.source] = True logging.info(f"模块 {event.source} 开始运行") run_event = Event( event_id=int(time.time()), type=EventType.MODULE_RUN.value, source='pool', target=event.source ) event_center.publish(run_event) def _save_data(self): """保存数据到文件""" try: with open(GlobalConfig.POOL_SAVE_PATH, 'w', encoding='utf-8') as f: json.dump(self.data_store, f, ensure_ascii=False, indent=2) except IOError as e: logging.error(f"[号码池] 保存数据失败: {str(e)}") def _load_data(self): """从文件加载数据""" if os.path.exists(GlobalConfig.POOL_SAVE_PATH): try: with open(GlobalConfig.POOL_SAVE_PATH, 'r', encoding='utf-8') as f: data = json.load(f) with self.lock: self.data_store.update(data) logging.info("[号码池] 成功加载之前保存的数据") except (IOError, json.JSONDecodeError) as e: logging.error(f"[号码池] 加载数据失败: {str(e)}") def update(self, label, value): """更新号码池数据""" with self.lock: label_mapping = { "前区:": 'front_numbers', "后区:": 'back_numbers', "前数字频:": 'front_freq', "前数字缺:": 'front_missing', "后数字频:": 'back_freq', "后数字缺:": 'back_missing', "前频繁推:": 'front_freq_50', "后低频推:": 'back_infreq_50', "生组合数:": 'comb_count', "未组合码:": 'uncombined', "前推荐多:": 'front_rec_more', "前推荐少:": 'front_rec_less', "后推荐多:": 'back_rec_more', "后推荐少:": 'back_rec_less', "和值:": 'sum_rec', "质合比:": 'prime_rec', "奇偶比:": 'odd_even_rec', "断区推荐:": 'zone_rec', "连号推荐:": 'consec_rec', "冷热推荐:": 'hot_cold_rec', "后区热号:": 'hot_rec', "后区冷号:": 'cold_rec', "趋势号:": 'trend_rec' } if label in label_mapping: self.data_store[label_mapping[label]] = value self._save_data() # ====== 基础模块类 ====== class BaseModule: def __init__(self, module_name: str): self.module_name = module_name self._handlers = {} self._setup_subscriptions() self._initialize() self.dynamic_data = {} def _update_dynamic_data(self, data): """更新动态数据""" self.dynamic_data.update(data) def _update_ui(self): """更新UI(子类必须实现)""" raise NotImplementedError("子类必须实现 _update_ui 方法") def _setup_subscriptions(self): """设置事件订阅""" event_center.subscribe(EventType.DATA_SUBMIT.value, self._handle_data_submit) event_center.subscribe(EventType.MODULE_READY.value, self._handle_module_ready) def _handle_data_submit(self, event): """默认数据提交处理器""" pass def _handle_module_ready(self, event): """默认模块就绪处理器""" pass def clear_dynamic_data(self): """清除动态数据""" for key in self.dynamic_data: if isinstance(self.dynamic_data[key], list): self.dynamic_data[key] = [] elif isinstance(self.dynamic_data[key], dict): self.dynamic_data[key] = {} else: self.dynamic_data[key] = "" def save_dynamic_data(self, file_path): """保存动态数据到文件""" with open(file_path, 'w') as f: json.dump(self.dynamic_data, f) def refresh_to_pool(self, number_pool): """刷新数据到号码池""" for key, value in self.dynamic_data.items(): pool_label = f"{key}:" if not key.endswith(":") else key number_pool.update(pool_label, value) def _initialize(self): """初始化模块""" ready_event = Event( event_id=int(time.time()), type=EventType.MODULE_READY.value, # 明确 event_type source=self.module_name, target='pool' ) event_center.publish(ready_event) def run(self): """运行模块""" raise NotImplementedError("子类必须实现 run 方法") def handle_event(self, event): """处理事件""" handler = self._handlers.get(event.type) if handler: try: handler(event) except Exception as e: logging.error(f"处理事件失败: {e}") def register_handler(self, event_type, handler): """注册事件处理器""" self._handlers[event_type] = handler # ====== 输入分析模块 ====== class InputAnalysisModule(BaseModule): def __init__(self, module_name: str, labels: list = None, master=None): super().__init__(module_name) self.master = master self.labels = labels or [ "排除号码", "前区", "后区", "推荐号码", "前区", "后区" ] self._ui_callback = None self._setup_event_handlers() self.recommend_front_var = StringVar() self.recommend_back_var = StringVar() self.dynamic_data = { "排除号码": {"前区": [], "后区": []}, "推荐号码": {"前区": [], "后区": []} } # 初始化排除号码输入框 self.exclude_front_entries = [] self.exclude_back_entries = [] self.dynamic_text = None def _update_dynamic_data(self, data): """更新动态数据""" self.dynamic_data.update(data) def _update_ui(self): """更新UI""" print(f"模块 {self.module_name} UI 更新完成") def register_ui_callback(self, callback): """注册UI回调函数""" if not callable(callback): raise ValueError("回调函数必须是可调用对象") self._ui_callback = callback print(f"✅ 已注册UI回调函数: {callback.__name__}") def _notify_ui(self, data): """通知UI更新""" if self._ui_callback: try: self._ui_callback(data) except Exception as e: print(f"UI回调执行失败: {str(e)}") @staticmethod def _create_number_inputs(parent, count): """创建号码输入框""" entries = [] frame = Frame(parent) frame.pack(fill='x', padx=10, pady=2) for i in range(count): entry = Entry(frame, width=5) entry.pack(side='left', padx=2) entries.append(entry) return entries def _run_module(self): """发送运行指令""" exclude_front = self._get_exclude_numbers(self.exclude_front_entries) exclude_back = self._get_exclude_numbers(self.exclude_back_entries) run_event = Event( event_id=int(time.time()), type=EventType.MODULE_RUN.value, source=GlobalConfig.module1_id, target='module1', data={ "exclude_front": exclude_front, "exclude_back": exclude_back }, token=GlobalConfig.module1_id ) event_center.publish(run_event) logger.info(f"已发送运行指令到模块1 [Token: {GlobalConfig.module1_id}]") @staticmethod def _get_exclude_numbers(entries): """从输入框获取排除号码""" numbers = [] for entry in entries: val = entry.get().strip() if val.isdigit(): num = int(val) if 1 <= num <= 33: numbers.append(num) else: logger.warning(f"无效号码输入: {num}") return numbers def _setup_event_handlers(self): """配置事件处理器""" event_center.subscribe( EventType.MODULE_RUN.value, self._handle_run_event, token=self.module_name ) def _handle_run_event(self, event): """处理运行事件""" if event.target != self.module_name: return print(f"模块 {self.module_name} 收到运行事件") def _update_ui_with_result(self, result): """根据结果更新UI""" if 'recommended_fronts' in result: self.recommend_front_var.set(' '.join(map(str, result['recommended_fronts']))) if 'recommended_backs' in result: self.recommend_back_var.set(' '.join(map(str, result['recommended_backs']))) def _update_dynamic_text(self, data): """更新动态文本""" if not hasattr(self, 'dynamic_text') or self.dynamic_text is None: logging.warning("未找到 dynamic_text 控件") return if data.get("token") == GlobalConfig.module1_id: self.dynamic_text.insert('end', f"【{GlobalConfig.module1_id}】分析结果:\n") self.dynamic_text.insert('end', f"前区排除: {data.get('exclude_front', [])}\n") self.dynamic_text.insert('end', f"后区排除: {data.get('exclude_back', [])}\n\n") self.dynamic_text.see('end') def update_ui(self, data): """更新UI(供前端加载器调用)""" if 'update_type' in data: if data['update_type'] == 'input_data': self._update_dynamic_data(data.get('data', {})) self._update_ui() # ====== 组合分析模块 ====== class CombinationAnalysisModule(BaseModule): def __init__(self, module_name: str, labels: list = None, master=None): super().__init__(module_name) self.master = master self.labels = labels or ["推荐号码"] self.some_frame = None self.dynamic_text = None self.dynamic_data = { "前数字频": {}, "前数字缺": [], "后数字频": {}, "后数字缺": [], "前频繁推": [], "后低频推": [], "生组合数": 0, "未组合码": [] } self._setup_result_handler() self._create_ui() def _setup_result_handler(self): """设置结果处理器""" def handler(event): if event.target == self.module_name and event.data.get("token") == GlobalConfig.module2_id: self._update_dynamic_text(event.data) event_center.subscribe( EventType.ANALYSIS_RESULT.value, handler, token=GlobalConfig.module2_id ) def _create_ui(self): """创建界面组件""" self.some_frame = Frame(self.master) self.some_frame.pack(fill='x', padx=10, pady=5) label_text = self.labels[0] if len(self.labels) > 0 else "推荐号码" Label(self.some_frame, text=label_text, font=("楷体", 14)).pack() # 动态文本框 self.dynamic_text = Text(self.some_frame, height=10) self.dynamic_text.pack(fill='both', padx=10, pady=5) def _update_dynamic_text(self, result): """更新动态文本框内容""" if hasattr(self, 'dynamic_text') and self.dynamic_text is not None: self.dynamic_text.delete(1.0, 'end') self.dynamic_text.insert('end', json.dumps(result, indent=2, ensure_ascii=False)) def _submit_data(self, data): """提交分析结果到号码池""" logger.info(f"提交数据: {data}") # ====== 跟随分析模块 ====== class FollowAnalysisModule(BaseModule): def __init__(self, module_name: str): super().__init__(module_name) self.dynamic_data = {"follow_data": {}} def _update_dynamic_data(self, data): """更新动态数据""" self.dynamic_data.update(data) def _update_ui(self): """更新UI""" print(f"模块 {self.module_name} UI 更新完成") def _handle_module_run(self, event): """处理模块运行事件""" logger.info(f"跟随分析模块 {self.module_name} 开始运行") front_rec_more = sorted(random.sample(range(1, 36), 5)) front_rec_less = sorted(random.sample(range(1, 36), 5)) back_rec_more = sorted(random.sample(range(1, 13), 2)) back_rec_less = sorted(random.sample(range(1, 13), 2)) self._submit_data({ "前推荐多": front_rec_more, "前推荐少": front_rec_less, "后推荐多": back_rec_more, "后推荐少": back_rec_less }) complete_event = Event( event_id=int(time.time()), type=EventType.MODULE_COMPLETE.value, # 明确 event_type source=self.module_name, target='pool' ) event_center.publish(complete_event) def update_ui(self, data): """更新UI(供前端加载器调用)""" if 'update_type' in data and data['update_type'] == 'combination_data': self._update_dynamic_data(data.get('data', {})) self._update_ui() # ====== 趋势分析模块 ====== class TrendAnalysisModule(BaseModule): def __init__(self, module_name: str): super().__init__(module_name) self.dynamic_data = {"trend_data": {}} def _update_dynamic_data(self, data): """更新动态数据""" self.dynamic_data.update(data) def _update_ui(self): """更新UI""" print(f"模块 {self.module_name} UI 更新完成") def _handle_module_run(self, event): """处理模块运行事件""" logger.info(f"趋势分析模块 {self.module_name} 开始运行") sum_value = random.randint(60, 125) prime_ratio = f"{random.randint(1, 5)}:{random.randint(1, 5)}" odd_even_ratio = f"{random.randint(1, 5)}:{random.randint(1, 5)}" zone_rec = random.choice(["一区", "二区", "三区", "四区", "五区", "六区", "七区"]) consec_rec = random.sample(range(1, 36), 2) hot_rec = sorted(random.sample(range(1, 13), 2)) cold_rec = sorted(random.sample(range(1, 13), 2)) trend_rec = sorted(random.sample(range(1, 36), 5)) self._submit_data({ "和值": sum_value, "质合比": prime_ratio, "奇偶比": odd_even_ratio, "断区推荐": zone_rec, "连号推荐": consec_rec, "后区热号": hot_rec, "后区冷号": cold_rec, "趋势号": trend_rec }) complete_event = Event( event_id=int(time.time()), type=EventType.MODULE_COMPLETE.value, # 明确 event_type source=self.module_name, target='pool' ) event_center.publish(complete_event) def update_ui(self, data): """更新UI(供前端加载器调用)""" if 'update_type' in data and data['update_type'] == 'trend_data': self._update_dynamic_data(data.get('data', {})) self._update_ui() # ====== 号码生成模块 ====== class NumberGenerationModule(BaseModule): def __init__(self, module_name: str, labels: list = None): super().__init__(module_name) self.labels = labels or [] self.dynamic_data = { "胆码": { "前区": [], "后区": [] }, "推荐5注号码": { "1": "", "2": "", "3": "", "4": "", "5": "" } } def _handle_module_run(self, event): """处理模块运行事件""" logger.info(f"号码生成模块 {self.module_name} 运行") # 生成号码组合 generated = [] for _ in range(5): front = sorted(random.sample(range(1, 36), 5)) back = sorted(random.sample(range(1, 13), 2)) generated.append({"front": front, "back": back}) # 提交结果 self._submit_data({ "generated_numbers": generated }) # 标记完成 complete_event = Event( event_id=int(time.time()), type=EventType.MODULE_COMPLETE.value, source=self.module_name, target='pool' ) event_center.publish(complete_event) def update_ui(self, data): """更新UI(供前端加载器调用)""" if 'update_type' in data: if data['update_type'] == 'generation_data': self._update_dynamic_data(data.get('data', {})) self._update_ui() # ====== 对话框基类(抽象重复逻辑) ====== class ModuleDialogBase: def __init__(self, parent, module_id): self.parent = parent self.module_id = module_id self.create_dialog() def create_dialog(self): self.dialog = Toplevel() self.dialog.title(f"{self.module_id} - 设置") self.dialog.geometry("400x300") self.dialog.resizable(False, False) # ====== 对话框管理器 ====== class DialogManager: def __init__(self): self.dialogs = {} self._setup_subscriptions() def _setup_subscriptions(self): """设置事件订阅""" event_center.subscribe(EventType.DIALOG_OPEN.value, self._handle_dialog_open) event_center.subscribe(EventType.DIALOG_CLOSE.value, self._handle_dialog_close) def _handle_dialog_open(self, event): """处理对话框打开事件""" dialog_type = event.data.get('dialog_type') if dialog_type and dialog_type not in self.dialogs: self._create_dialog(dialog_type) def _handle_dialog_close(self, event): """处理对话框关闭事件""" dialog_type = event.data.get('dialog_type') if dialog_type and dialog_type in self.dialogs: self.dialogs[dialog_type].destroy() del self.dialogs[dialog_type] def _create_dialog(self, dialog_type): """创建对话框""" dialog = Toplevel() dialog.title(f"{dialog_type} - 设置") dialog.geometry("400x300") dialog.resizable(False, False) # 根据对话框类型创建同的内容 if dialog_type == GlobalConfig.module1_id: self._create_input_analysis_dialog(dialog) elif dialog_type == GlobalConfig.module2_id: self._create_combination_analysis_dialog(dialog) elif dialog_type == GlobalConfig.module3_id: self._create_follow_analysis_dialog(dialog) elif dialog_type == GlobalConfig.module4_id: self._create_trend_analysis_dialog(dialog) elif dialog_type == GlobalConfig.module5_id: self._create_number_generation_dialog(dialog) self.dialogs[dialog_type] = dialog dialog.protocol("WM_DELETE_WINDOW", lambda: self._close_dialog(dialog_type)) def _create_input_analysis_dialog(self, parent): """创建输入分析对话框""" main_frame = Frame(parent) main_frame.pack(fill='both', expand=True, padx=10, pady=10) # 排除号码区 exclude_frame = LabelFrame(main_frame, text="排除号码", font=('微软雅黑', 10)) exclude_frame.pack(fill='x', pady=5) # 前区排除 Label(exclude_frame, text="前区排除:", font=('微软雅黑', 9)).pack(anchor='w') front_frame = Frame(exclude_frame) front_frame.pack(fill='x', pady=2) self.front_exclude_vars = [] for i in range(10): var = StringVar() Entry(front_frame, textvariable=var, width=3).pack(side='left', padx=2) self.front_exclude_vars.append(var) # 后区排除 Label(exclude_frame, text="后区排除:", font=('微软雅黑', 9)).pack(anchor='w', pady=(10, 0)) back_frame = Frame(exclude_frame) back_frame.pack(fill='x', pady=2) self.back_exclude_vars = [] for i in range(10): var = StringVar() Entry(back_frame, textvariable=var, width=3).pack(side='left', padx=2) self.back_exclude_vars.append(var) # 推荐号码区 recommend_frame = LabelFrame(main_frame, text="推荐号码", font=('微软雅黑', 10)) recommend_frame.pack(fill='x', pady=5) # 前区推荐 Label(recommend_frame, text="前区推荐:", font=('微软雅黑', 9)).pack(anchor='w') self.front_recommend_var = StringVar() Entry(recommend_frame, textvariable=self.front_recommend_var, state='readonly', width=30).pack(fill='x', pady=2) # 后区推荐 Label(recommend_frame, text="后区推荐:", font=('微软雅黑', 9)).pack(anchor='w', pady=(10, 0)) self.back_recommend_var = StringVar() Entry(recommend_frame, textvariable=self.back_recommend_var, state='readonly', width=30).pack(fill='x', pady=2) # 按钮区 button_frame = Frame(main_frame) button_frame.pack(fill='x', pady=10) Button(button_frame, text="保存", command=self._save_input_settings).pack(side='right', padx=5) Button(button_frame, text="取消", command=lambda: self._close_dialog(GlobalConfig.module1_id)).pack( side='right', padx=5) def _create_combination_analysis_dialog(self, parent): """创建组合分析对话框""" main_frame = Frame(parent) main_frame.pack(fill='both', expand=True, padx=10, pady=10) # 结果显示区 result_frame = LabelFrame(main_frame, text="组合分析结果", font=('微软雅黑', 10)) result_frame.pack(fill='both', expand=True) # 创建结果显示组件 labels = ["前数字频", "前数字缺", "后数字频", "后数字缺", "前频繁推", "后低频推", "生组合数", "未组合码"] self.combination_vars = {} for i, label in enumerate(labels): frame = Frame(result_frame) frame.pack(fill='x', padx=5, pady=2) Label(frame, text=f"{label}:", width=10, anchor='w').pack(side='left') var = StringVar() Entry(frame, textvariable=var, state='readonly', width=20).pack(side='left', fill='x', expand=True) self.combination_vars[label] = var # 按钮区 button_frame = Frame(main_frame) button_frame.pack(fill='x', pady=10) Button(button_frame, text="关闭", command=lambda: self._close_dialog(GlobalConfig.module2_id)).pack( side='right', padx=5) def _create_follow_analysis_dialog(self, parent): """创建跟随分析对话框""" main_frame = Frame(parent) main_frame.pack(fill='both', expand=True, padx=10, pady=10) # 结果显示区 result_frame = LabelFrame(main_frame, text="跟随分析结果", font=('微软雅黑', 10)) result_frame.pack(fill='both', expand=True) # 创建结果显示组件 labels = ["前推荐多", "前推荐少", "后推荐多", "后推荐少"] self.follow_vars = {} for i, label in enumerate(labels): frame = Frame(result_frame) frame.pack(fill='x', padx=5, pady=2) Label(frame, text=f"{label}:", width=10, anchor='w').pack(side='left') var = StringVar() Entry(frame, textvariable=var, state='readonly', width=20).pack(side='left', fill='x', expand=True) self.follow_vars[label] = var # 按钮区 button_frame = Frame(main_frame) button_frame.pack(fill='x', pady=10) Button(button_frame, text="关闭", command=lambda: self._close_dialog(GlobalConfig.module3_id)).pack( side='right', padx=5) def _create_trend_analysis_dialog(self, parent): """创建趋势分析对话框""" main_frame = Frame(parent) main_frame.pack(fill='both', expand=True, padx=10, pady=10) # 结果显示区 result_frame = LabelFrame(main_frame, text="趋势分析结果", font=('微软雅黑', 10)) result_frame.pack(fill='both', expand=True) # 创建结果显示组件 labels = ["和值", "质合比", "奇偶比", "断区推荐", "连号推荐", "后区热号", "后区冷号", "趋势号"] self.trend_vars = {} for i, label in enumerate(labels): frame = Frame(result_frame) frame.pack(fill='x', padx=5, pady=2) Label(frame, text=f"{label}:", width=10, anchor='w').pack(side='left') var = StringVar() Entry(frame, textvariable=var, state='readonly', width=20).pack(side='left', fill='x', expand=True) self.trend_vars[label] = var # 按钮区 button_frame = Frame(main_frame) button_frame.pack(fill='x', pady=10) Button(button_frame, text="关闭", command=lambda: self._close_dialog(GlobalConfig.module4_id)).pack( side='right', padx=5) def _create_number_generation_dialog(self, parent): """创建数字生成对话框""" main_frame = Frame(parent) main_frame.pack(fill='both', expand=True, padx=10, pady=10) # 胆码输入区 dan_frame = LabelFrame(main_frame, text="胆码", font=('微软雅黑', 10)) dan_frame.pack(fill='x', pady=5) # 前区胆码 Label(dan_frame, text="前区胆码:", font=('微软雅黑', 9)).pack(anchor='w') front_frame = Frame(dan_frame) front_frame.pack(fill='x', pady=2) self.front_dan_vars = [] for i in range(5): var = StringVar() Entry(front_frame, textvariable=var, width=3).pack(side='left', padx=2) self.front_dan_vars.append(var) # 后区胆码 Label(dan_frame, text="后区胆码:", font=('微软雅黑', 9)).pack(anchor='w', pady=(10, 0)) back_frame = Frame(dan_frame) back_frame.pack(fill='x', pady=2) self.back_dan_vars = [] for i in range(5): var = StringVar() Entry(back_frame, textvariable=var, width=3).pack(side='left', padx=2) self.back_dan_vars.append(var) # 推荐号码区 recommend_frame = LabelFrame(main_frame, text="推荐5注号码", font=('微软雅黑', 10)) recommend_frame.pack(fill='both', expand=True, pady=5) self.recommend_vars = {} for i in range(1, 6): frame = Frame(recommend_frame) frame.pack(fill='x', padx=5, pady=2) Label(frame, text=f"第{i}注:", width=6, anchor='w').pack(side='left') var = StringVar() Entry(frame, textvariable=var, state='readonly', width=30).pack(side='left', fill='x', expand=True) self.recommend_vars[str(i)] = var # 按钮区 button_frame = Frame(main_frame) button_frame.pack(fill='x', pady=10) Button(button_frame, text="保存", command=self._save_generation_settings).pack(side='right', padx=5) Button(button_frame, text="取消", command=lambda: self._close_dialog(GlobalConfig.module5_id)).pack( side='right', padx=5) def _save_input_settings(self): """保存输入分析设置""" # 收集前区排除号码 front_exclude = [] for var in self.front_exclude_vars: if var.get().strip(): try: front_exclude.append(int(var.get())) except ValueError: pass # 收集后区排除号码 back_exclude = [] for var in self.back_exclude_vars: if var.get().strip(): try: back_exclude.append(int(var.get())) except ValueError: pass # 保存设置 settings = { 'exclude_front': front_exclude, 'exclude_back': back_exclude } # 发送保存事件 save_event = Event( event_id=int(time.time()), type=EventType.DATA_SUBMIT.value, source='dialog_manager', target=GlobalConfig.module1_id, data=settings ) event_center.publish(save_event) messagebox.showinfo("提示", "输入分析设置已保存") self._close_dialog(GlobalConfig.module1_id) def _save_generation_settings(self): """保存数字生成设置""" # 收集前区胆码 front_dan = [] for var in self.front_dan_vars: if var.get().strip(): try: front_dan.append(int(var.get())) except ValueError: pass # 收集后区胆码 back_dan = [] for var in self.back_dan_vars: if var.get().strip(): try: back_dan.append(int(var.get())) except ValueError: pass # 保存设置 settings = { 'front_dan': front_dan, 'back_dan': back_dan } # 发送保存事件 save_event = Event( event_id=int(time.time()), type=EventType.DATA_SUBMIT.value, source='dialog_manager', target=GlobalConfig.module5_id, data=settings ) event_center.publish(save_event) messagebox.showinfo("提示", "数字生成设置已保存") self._close_dialog(GlobalConfig.module5_id) def _close_dialog(self, dialog_type): """关闭对话框""" if dialog_type in self.dialogs: close_event = Event( event_id=int(time.time()), type=EventType.DIALOG_CLOSE.value, source='dialog_manager', target='dialog_manager', data={'dialog_type': dialog_type} ) event_center.publish(close_event) # ====== 应用上下文类 ====== class AppContext: def __init__(self): GlobalConfig.check_config() self.modules_loaded = {module: False for module in GlobalConfig.MODULES} self.modules_completed = {module: False for module in GlobalConfig.MODULES} self.main_ui = None self.dialog_manager = None self.number_pool = NumberPool() print("应用上下文初始化完成") # 实例化局上下文 app = AppContext() # ==================== 输入分析引擎 ==================== class InputAnalysisEngine: def __init__(self): self.module_name = "input_analysis_engine" self._setup_subscriptions() logger.info("输入分析引擎已初始化") def _setup_subscriptions(self): """设置事件订阅""" event_center.subscribe( EventType.MODULE_RUN.value, self._handle_module_run, token=self.module_name ) def _handle_module_run(self, event): """处理模块运行事件""" if event.target != self.module_name: return logger.info("输入分析引擎开始处理") available_fronts = [] available_backs = [] try: # 获取排除号码 exclude_front = event.data.get('exclude_front', []) exclude_back = event.data.get('exclude_back', []) # 生成前区可用号码 (1-35,排除指定号码) all_fronts = list(range(1, 36)) available_fronts = [num for num in all_fronts if num not in exclude_front] # 生成后区可用号码 (1-12,排除指定号码) all_backs = list(range(1, 13)) available_backs = [num for num in all_backs if num not in exclude_back] # 发布分析结果 result_event = Event( event_id=int(time.time()), type=EventType.ANALYSIS_RESULT.value, # 明确 event_type source=self.module_name, target='pool', data={ "available_fronts": available_fronts, "available_backs": available_backs, "exclude_front": exclude_front, "exclude_back": exclude_back }, token=self.module_name ) event_center.publish(result_event) logger.info("输入分析结果已发布") except Exception as e: logger.error(f"输入分析失败: {str(e)}") error_event = Event( event_id=int(time.time()), type=EventType.ERROR.value, # 明确 event_type source=self.module_name, target='pool', data={"error": str(e)}, token=self.module_name ) event_center.publish(error_event) ui_update_event = Event( event_id=int(time.time()), type=EventType.UI_UPDATE.value, # 明确 event_type source=self.module_name, target='frontend_loader', data={ 'update_type': 'input_data', 'data': { "available_fronts": available_fronts, "available_backs": available_backs } }, token=GlobalConfig.module1_id # 指定目标模块 ) event_center.publish(ui_update_event) # ====== 组合分析引擎 ====== class CombinationAnalysisEngine: def __init__(self): self._setup_subscriptions() logger.info("组合分析引擎已初始化") def _setup_subscriptions(self): event_center.subscribe( EventType.MODULE_RUN.value, self._handle_module_run, token=GlobalConfig.module2_id ) def _handle_module_run(self, event): logger.info("组合分析引擎开始处理") # 模拟分析逻辑 front_freq = {i: random.randint(1, 100) for i in range(1, 36)} front_missing = random.sample(range(1, 36), 5) back_freq = {i: random.randint(1, 50) for i in range(1, 13)} back_missing = random.sample(range(1, 13), 2) front_freq_rec = sorted(random.sample(range(1, 36), 5)) back_infreq_rec = sorted(random.sample(range(1, 13), 2)) comb_count = random.randint(100, 1000) uncombined = random.sample(range(1, 36), 5) # 发布分析结果 result_event = Event( event_id=int(time.time()), type=EventType.ANALYSIS_RESULT.value, source=GlobalConfig.module2_id, target='pool', data={ "前数字频": front_freq, "前数字缺": front_missing, "后数字频": back_freq, "后数字缺": back_missing, "前频繁推": front_freq_rec, "后低频推": back_infreq_rec, "生组合数": comb_count, "未组合码": uncombined }, token=GlobalConfig.module2_id ) event_center.publish(result_event) logger.info("组合分析结果已发布") ui_update_event = Event( event_id=int(time.time()), type=EventType.UI_UPDATE.value, source=self.module_name, target='frontend_loader', data={ 'update_type': 'input_data', 'data': { "available_fronts": available_fronts, "available_backs": available_backs } }, token=GlobalConfig.module1_id # 指定目标模块 ) event_center.publish(ui_update_event)
最新发布
08-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值