Dialog中使用ON_UPDATE_COMMAND_UI的方法

本文介绍了在基于对话框的应用程序中如何正确使用ON_UPDATE_COMMAND_UI来更新菜单项的状态,包括禁用、选中等,并提供了具体的实现步骤。

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

Dialog 中使用ON_UPDATE_COMMAND_UI的方法

问题:

一般情况下我们用UPDATE_COMMAND_UI来修改菜单的状态(enable/disable,check/uncheck, change text),但这个方法在一个基于对话框上的菜单却没有效果。

void CTestDlg::OnUpdateFileExit(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
pCmdUI->SetCheck(TRUE);
pCmdUI->SetRadio(TRUE);
pCmdUI->SetText("Close");
//以上方法在MDI、SDI程序中都能起作用,在对话框中却没有效果,根本没有调用这个函数。
}

原因分析:

当显示一个下拉的菜单的时候,在显示菜单前会发送WM_INITMENUPOPUP消息。而CFrameWnd::OnInitMenuPopup函数会刷新这个菜单项,同时如果有UPDATE_COMMAND_UI响应函数,则调用它。通过它来更新反应每个菜单的外观效果(enabled/disabled, checked/unchecked).
在一个基于对话框的程序中,因为没有OnInitMenuPopup函数,所以不会调用UPDATE_COMMAND_UI响应函数,而是使用了CWnd类的默认处理, 这种处理没有调用UPDATE_COMMAND_UI响应函数。

解决方法如下:

第一步:
在对话框类的.cpp文件,添加一个ON_WM_INITMENUPOPUP入口到消息映射里面
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//}}AFX_MSG_MAP
ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()
第二步:
在对话框类的.h文件添加消息函数声明。
// Generated message map functions
//{{AFX_MSG(CDisableDlgMenuDlg)
afx_msg void OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
第三步:
在对话框类的.cpp文件添加如下函数代码(大部分代码取自WinFrm.cpp文件的函数CFrameWnd::OnInitMenuPopup):
void C******Dlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
{
ASSERT(pPopupMenu != NULL);
// Check the enabled state of various menu items.

CCmdUI state;
state.m_pMenu = pPopupMenu;
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pParentMenu == NULL);

// Determine if menu is popup in top-level menu and set m_pOther to
// it if so (m_pParentMenu == NULL indicates that it is secondary popup).
HMENU hParentMenu;
if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
state.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup.
else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
{
CWnd* pParent = this;
// Child windows don't have menus--need to go to the top!
if (pParent != NULL &&
(hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
{
int nIndexMax = ::GetMenuItemCount(hParentMenu);
for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
{
// When popup is found, m_pParentMenu is containing menu.
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
break;
}
}
}
}

state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
continue; // Menu separator or invalid cmd - ignore it.

ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pMenu != NULL);
if (state.m_nID == (UINT)-1)
{
// Possibly a popup menu, route to first item of that popup.
state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL ||
(state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
state.m_nID == (UINT)-1)
{
continue; // First item of popup can't be routed to.
}
state.DoUpdate(this, TRUE); // Popups are never auto disabled.
}
else
{
// Normal menu item.
// Auto enable/disable if frame window has m_bAutoMenuEnable
// set and command is _not_ a system command.
state.m_pSubMenu = NULL;
state.DoUpdate(this, FALSE);
}

// Adjust for menu deletions and additions.
UINT nCount = pPopupMenu->GetMenuItemCount();
if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount &&
pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
}
}

另一种解决办法:

1,重载CDialog 的ContinueModal()虚函数
2,在ContinueModal()中添加代码:UpdateDialogControls(this,true);
3,为一个控件添加ON_UPDATE_COMMAND_UI消息响应函数

afx_msg void OnUpdateButton1(CCmdUI *pCmdUI); 
还有宏:
ON_UPDATE_COMMAND_UI(IDC_BUTTON1,OnUpdateButton1)
4,在函数OnUpdateButton1(CCmdUI *pCmdUI)中添加处理代码。 

在对话框上添加工具条(toolbar)和菜单(menu)实例: 

在对话框类中添加下面的函数

BOOL CMyDlg::ContinueModal() 
{ 
if( m_wndtoolbar.IsWindowVisible() ) 
{ 
CFrameWnd* pParent = ( CFrameWnd* ) m_wndtoolbar.GetParent(); 
if( pParent ) 
m_wndtoolbar.OnUpdateCmdUI( pParent, ( WPARAM ) TRUE ); 
} 

CMenu* pMainMenu = GetMenu(); 
CCmdUI cmdUI; 
for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); ++n) 
{ 
CMenu* pSubMenu = pMainMenu->GetSubMenu(n); 
cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount(); 
for (UINT i = 0; i < cmdUI.m_nIndexMax;++i) 
{ 
cmdUI.m_nIndex = i; 
cmdUI.m_nID = pSubMenu->GetMenuItemID(i); 
cmdUI.m_pMenu = pSubMenu; 
cmdUI.DoUpdate(this, FALSE); 
} 
} 
return CDialog::ContinueModal(); 
} 
然后再对应的.h中添加 BOOL ContinueModal();
这样就可以使用N_UPDATE_COMMAND_UI了。
另外,有些文章使用WM_KICKIDLE消息。发现cpu的使用率为100%。建议不要使用该函数
另一个缺点:
如果用键盘切换了VIEW,这个函数就不响应了,也就是说,如果使用右键菜单中间如果包括了根据VIEW变化的变量,那么就无法操作。
转载地址:

[1] http://blog.youkuaiyun.com/happyparrot/article/details/158252

[2] http://www.zzzj.com/html/20080424/33711.html

把代码完整写出来,(在写代码过程中要注意:模块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.dynamic_content = None self.module_instances = {} # 添加模块实例存储 self._init_modules() # 初始化所有模块 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) 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=600) self.center_frame.pack(side='left', fill='both', expand=True) # 右侧面板 self.right_panel = Frame(main_container, width=600, 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') # 模块内容容器 self.module_content_frame = Frame(dynamic_frame) self.module_content_frame.pack(fill='both', expand=True, padx=5, pady=5) def _setup_right_panel(self): """设置右侧号码池布局""" # 号码池标题 pool_title_frame = Frame(self.right_panel) pool_title_frame.pack(f极ill='x', pady=5) Label(pool_title_frame, text="号码池", font=('微软雅黑', 12, 'bold')).pack(anchor='w') # 号码池内容区 pool_content = Frame(self.right_panel, bd=1, relief='solid') 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) # 号码池项目 - 优化布局和样式 for label, var_name, row_id in GlobalConfig.UI_CONFIG: frame = Frame(scrollable_frame) frame.grid(row=row_id, column=极0, sticky='ew', padx=5, pady=2) # 左侧标签(固定宽度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): """创建输入分析模块的特定内容""" # 使用统一方法创建UI元素(带右边距2px) 这里修改 排除号码:(用户手动输入的号码) 前区: 后区: 推荐号码:(模块1收到主界面模块1传输过来“排除号码”的信息后,按照设计要求进行排除,生成推荐号码,在下面的对应的对话框里呈现出来,其号码池的前区和后区也要同步进行)) 前区: 后区: front_container = self._create_ui_element(parent, "前区号码 (1-35)😊 front_entry = Entry(front_container) front_entry.pack(fill=‘x’) back_container = self._create_ui_element(parent, "后区号码 (1-12):") back_entry = Entry(back_container) back_entry.pack(fill='x') # 结果显示区 result_frame = Frame(parent) result_frame.pack(fill='both', expand=True, pady=5) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') result_text.pack(fill='both', expand=True) scrollbar.config(command=result_text.yview) # 保存对控件的引用 self.front_entry = front_entry self.back_entry = back_entry self.result_text = result_text def _create_combination_analysis_content(self, parent: Frame): """创建组合分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) # 使用统一方法创建UI元素(带右边距2px)front_hot_container = self._create_ui_element(content_frame, "前区热号:") front_hot_entry = Entry(front_hot_container) front_hot_entry.pack(fill='x') front_freq_container = self._create_ui_element(content_frame, "前数字频:") front_freq_entry = Entry(front_freq_container) front_freq_entry.pack(fill='x') front_freq_rec_container = self._create_ui_element(content_frame, "前频繁推:") front_freq_rec_entry = Entry(front_freq_rec_container) front极_freq_rec_entry.pack(fill='x') back_hot_container = self._create_ui_element(content_frame, "后区热号:") back_hot_entry = Entry(back_hot_container) back_hot_entry.pack(fill='x') back_freq_container = self._create_ui_element(content_frame, "后数字频:") back_freq_entry = Entry(back_freq_container) back_freq_entry.pack(fill='x') back_infreq_rec_container = self._create_ui_element(content_frame, "后低频推:") back_infreq_rec_entry = Entry(back_infreq_rec_container) back_infreq_rec_entry.pack(fill='x') # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') result_text.pack(fill='both', expand=True) scrollbar.config(command=result_text.yview) # 保存对控件的引用 self.front_hot_entry = front_hot_entry self.front_freq_entry = front_freq_entry self.front_freq_rec_entry = front_freq_rec_entry self.back_hot_entry = back_hot_entry self.back_freq_entry = back_freq_entry self.back_infreq_rec_entry = back_infreq_rec_entry self.result_text = result_text def _create_follow_analysis_content(self, parent: Frame): """创建跟随分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) # 使用统一方法创建UI元素(带右边距2px)front_more_container = self._create_ui_element(content_frame, "前推荐多:") front_more_entry = Entry(front_more_container) front_more_entry.pack(fill='x') front_less_container = self._create_ui_element(content_frame, "前推荐少:") front_less_entry = Entry(front_less_container) front_less_entry.pack(fill='x') back_more_container = self._create_ui_element(content_frame, "后推荐多:") back_more_entry = Entry(back_more_container) back_more_entry.pack(fill='x') back_less_container = self._create_ui_element(content_frame, "后推荐少:") back_less_entry = Entry(back_less_container) back_less_entry.pack(fill='x') # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') result_text.pack(fill='both', expand=True) scrollbar.config(command=result_text.yview) # 保存对控件的引用 self.front_more_entry = front_more_entry self.front_less_entry = front_less_entry self.back_more_entry = back_more_entry self.back_less_entry = back_less_entry self.result_text = result_text def _create_trend_analysis_content(self, parent: Frame): """创建趋势分析模块的特定内容""" content_frame = Frame(parent) content_frame.pack(fill='both', expand=True, padx=10, pady=10) # 使用统一方法创建UI元素(带右边距2px)sum_value_container = self._create_ui_element(content_frame, "和值:") sum_value_entry = Entry(sum_value_container) sum_value_entry.pack(fill='x') prime_ratio_container = self._create_ui_element(content_frame, "质合比:") prime_ratio_entry = Entry(prime_ratio_container) prime_ratio_entry.pack(fill='x') odd_even_ratio_container = self._create_ui_element(content_frame, "奇偶比:") odd_even_ratio_entry = Entry(odd_even_ratio_container) odd_even_ratio_entry.pack(fill='x') zone_rec_container = self._create_ui_element(content_frame, "断区推荐:") zone_rec_entry = Entry(zone_rec_container) zone_rec_entry.pack(fill='x') consec_rec_container = self._create_ui_element(content_frame, "连号推荐:") consec_rec_entry = Entry(consec_rec_container) consec_rec_entry.pack(fill='x') hot_cold_rec_container = self._create_ui_element(content_frame, "冷热推荐:") hot_cold_rec_entry = Entry(hot_cold_rec_container) hot_cold_rec_entry.pack(fill='x') hot_rec_container = self._create_ui_element(content_frame, "后区热号:") hot_rec_entry = Entry(hot_rec_container) hot_rec_entry.pack(fill='x') cold_rec_container = self._create_ui_element(content_frame, "后区冷号:") cold_rec_entry = Entry(cold_rec_container) cold_rec_entry.pack(fill='x') trend_rec_container = self._create_ui_element(content_frame, "趋势号:") trend_rec_entry = Entry(trend_rec_container) trend_rec_entry.pack(fill='x') # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') result_text.pack(fill='both', expand=True) scrollbar.config(command=result_text.yview) # 保存对控件的引用 self.sum_value_entry = sum_value_entry self.prime_ratio_entry = prime_ratio_entry self.odd_even_ratio_entry = odd_even_ratio_entry self.zone_rec_entry = zone_rec_entry self.consec_rec_entry = consec_rec_entry self.hot_cold_rec_entry = hot_cold_rec_entry # 修复变量名拼写错误 self.hot_rec_entry = hot_rec_entry self.cold_rec_entry = cold_rec_entry self.trend_rec_entry = trend_rec_entry self.result_text = result_text 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_container = self._create_ui_element(dan_frame, "前区胆码:") front_dan_entry = Entry(front_dan_container) front_dan_entry.pack(fill='x') back_dan_container = self._create_ui_element(dan_frame, "后区胆码:") back_dan_entry = Entry(back_dan_container) back_dan_entry.pack(fill='x') # 结果显示区 result_frame = Frame(content_frame) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') result_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') result_text.pack(fill='both', expand=True) scrollbar.config(command=result_text.yview) # 保存对控件的引用 self.front_dan_entry = front_dan_entry self.back_dan_entry = back_dan_entry self.result_text = result_text def _run_module(self, dialog_type: str): """运行模块""" run_event = Event( event_id=int(time.time()), type=EventType.MODULE_RUN, source='dialog_manager', target=dialog_type ) event_center.publish(run_event) def _clear_module_data(self, module: str): """清除模块数据""" if module == "input_analysis": self.front_entry.delete(0, 'end') self.back_entry.delete(0, 'end') self.result_text.delete(1.0, 'end') elif module == "combination_analysis": self.front_hot_entry.delete(0, 'end') self.front_freq_entry.delete(0, 'end') self.front_freq_rec_entry.delete(0, 'end') self.back_hot_entry.delete(0, 'end') self.back_freq_entry.delete(0, 'end') self.back_infreq_rec_entry.delete(0, 'end') 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['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_module_complete(self, event: Event): self.status_var.set(f"{event.source} 模块运行完成") if hasattr(self, 'dynamic_text') and self.dynamic_text: self.dynamic_text.insert('end', f"\n{event.source} 模块已完成分析\n") def _run_module(self): """运行动态区模块""" if hasattr(self, 'current_module') and self.current_module: run_event = Event( event_id=int(time.time()), type=EventType.MODULE_RUN, source='main_ui', target=self.current_module ) event_center.publish(run_event) else: messagebox.showinfo("提示", "请先打开一个模块") def _clear_dynamic_content(self): """清除动态区内容""" if hasattr(self, 'dynamic_text') and self.dynamic_text: self.dynamic_text.delete(1.0, 'end') def _save_dynamic_content(self): """保存动态区内容""" if hasattr(self, 'dynamic_text') and self.dynamic_text: content = self.dynamic_text.get(1.0, 'end') try: with open("dynamic_content.txt", "w", encoding="utf-8") as f: f.write(content) messagebox.showinfo("保存成功", "动态区内容已保存到dynamic_content.txt") except Exception as e: messagebox.showerror("保存失败", str(e)) def _refresh_dynamic(self): """刷新动态区""" if self.current_module: self._on_module_button_click(self.current_module) # 添加动态内容创建方法 def _create_input_analysis_content(self): """创建输入分析模块的动态内容""" 这里修改 排除号码:(用户手动输入的号码) 前区: 后区: 推荐号码:(模块1收到主界面模块1传输过来“排除号码”的信息后,按照设计要求进行排除,生成推荐号码,在下面的对应的对话框里呈现出来,其号码池的前区和后区也要同步进行)) 前区: 后区: self.dynamic_content = Frame(self.module_content_frame) self.dynamic_content.pack(fill=‘both’, expand=True) # 前区号码输入 front_frame = Frame(self.dynamic_content) front_frame.pack(fill='x', pady=5) Label(front_frame, text="前区号码 (1-35):").pack(side='left') self.front_entry = Entry(front_frame, width=30) self.front_entry.pack(side='left', padx=5) # 后区号码输入 back_frame = Frame(self.dynamic_content) back_frame.pack(fill='x', pady=5) Label(back_frame, text="后区号码 (1-12):").pack(side='left') self.back_entry = Entry(back_frame, width=30) self.back_entry.pack(side='left', padx=5) # 结果显示区 result_frame = Frame(self.dynamic_content) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.dynamic_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.dynamic_text.pack(fill='both', expand=True) scrollbar.config(command=self.dynamic_text.yview) def _create_combination_analysis_content(self): """创建组合分析模块的动态内容""" self.dynamic_content = Frame(self.module_content_frame) self.dynamic_content.pack(fill='both', expand=True) # 组合分析内容 labels = [ "前数字频:", "前数字缺:", "后数字频:", "后数字缺:", "前频繁推:", "后低频推:", "生组合数:", "未组合码:" ] for label in labels: frame = Frame(self.dynamic_content) frame.pack(fill='x', pady=2) Label(frame, text=label, width=12, anchor='w').pack(side='left') entry = Entry(frame, width=30) entry.pack(side='left', padx=5) setattr(self, f"{label.replace(':', '')}_entry", entry) # 结果显示区 result_frame = Frame(self.dynamic_content) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.dynamic_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.dynamic_text.pack(fill='both', expand=True) scrollbar.config(command=self.dynamic_text.yview) def _create_follow_analysis_content(self): """创建跟随分析模块的动态内容""" self.dynamic_content = Frame(self.module_content_frame) self.dynamic_content.pack(fill='both', expand=True) # 跟随分析内容 labels = [ "前推荐多:", "前推荐少:", "后推荐多:", "后推荐少:" ] for label in labels: frame = Frame(self.dynamic_content) frame.pack(fill='x', pady=2) Label(frame, text=label, width=12, anchor='w').pack(side='left') entry = Entry(frame, width=30) entry.pack(side='left', padx=5) setattr(self, f"{label.replace(':', '')}_entry", entry) # 结果显示区 result_frame = Frame(self.dynamic_content) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.dynamic_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.dynamic_text.pack(fill='both', expand=True) scrollbar.config(command=self.dynamic_text.yview) def _create_trend_analysis_content(self): """创建趋势分析模块的动态内容""" self.dynamic_content = Frame(self.module_content_frame) self.dynamic_content.pack(fill='both', expand=True) # 趋势分析内容 labels = [ "和值:", "质合比:", "奇偶比:", "断区推荐:", "连号推荐:", "冷热推荐:", "后区热号:", "后区冷号:", "趋势号:" ] for label in labels: frame = Frame(self.dynamic_content) frame.pack(fill='x', pady=2) Label(frame, text=label, width=12, anchor='w').pack(side='left') entry = Entry(frame, width=30) entry.pack(side='left', padx=5) setattr(self, f"{label.replace(':', '')}_entry", entry) # 结果显示区 result_frame = Frame(self.dynamic_content) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.dynamic_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.dynamic_text.pack(fill='both', expand=True) scrollbar.config(command=self.dynamic_text.yview) def _create_number_generation_content(self): """创建数字生成模块的动态内容""" self.dynamic_content = Frame(self.module_content_frame) self.dynamic_content.pack(fill='both', expand=True) # 数字生成内容 # 胆码输入区 dan_frame = Frame(self.dynamic_content) dan_frame.pack(fill='x', pady=5) Label(dan_frame, text="前区胆码:").pack(side='left') self.front_dan_entry = Entry(dan_frame, width=15) self.front_dan_entry.pack(side='left', padx=5) Label(dan_frame, text="后区胆码:").pack(side='left') self.back_dan_entry = Entry(dan_frame, width=15) self.back_dan_entry.pack(side='left', padx=5) # 结果显示区 result_frame = Frame(self.dynamic_content) result_frame.pack(fill='both', expand=True) scrollbar = Scrollbar(result_frame) scrollbar.pack(side='right', fill='y') self.dynamic_text = Text(result_frame, yscrollcommand=scrollbar.set, wrap='word') self.dynamic_text.pack(fill='both', expand=True) scrollbar.config(command=self.dynamic_text.yview) # 添加事件处理方法 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-15
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值