wxPython显示wxMessageDialog时自定义事件处理函数停止调用问题咨询
问题原因解释
你遇到的现象是wxPython模态对话框的标准事件调度逻辑导致的,具体原因如下:
- 调用
dlg.ShowModal()时会暂停应用的全局主事件循环,启动一个嵌套的、仅针对模态对话框的局部事件循环。这个局部循环默认只会优先调度和模态对话框直接相关的事件(比如对话框的点击、重绘、关闭等交互事件),不会主动分发队列中积压的、和模态对话框无关的自定义事件给父窗口。 - 子线程仍然在持续调用
wx.PostEvent把自定义事件推到事件队列里,这些事件会一直积压,直到事件循环被其他系统事件唤醒。当你移动鼠标到主框架上时,会触发主窗口的鼠标移动、重绘类系统事件,唤醒事件循环的调度逻辑,顺带把队列里积压的所有自定义事件批量处理掉,所以会看到消费日志批量打印,鼠标移开后没有系统事件触发调度,自定义事件就又停止处理。
修复方案
如果你需要模态对话框显示期间,自定义事件仍然能正常被处理,可以选择以下两种方案:
方案1:改用非模态对话框
把ShowModal()改为调用Show(),非模态对话框不会阻塞全局事件循环,所有事件都会正常分发:
def _handle_button_event(self, event): dlg = wx.MessageDialog(self, 'Test Message', 'Test Message') # 改用非模态显示 dlg.Show()
方案2:如果必须使用模态对话框,可以添加定时器主动触发事件调度
在模态对话框显示期间启动一个低间隔的wx定时器,定时触发事件循环处理队列中的积压事件即可。
另外注意你提供的可复现代码存在笔误:sizer.Add(selenter code heref._button 需要改为 sizer.Add(self._button 才能正常运行。
内容的提问来源于stack exchange,提问作者user14607527
相关产品推荐
相关产品推荐

