wxPython消息对话框错误“捕获鼠标的窗口没有处理wxEVT_MOUSE_CAPTURE_LOST”

0 投票
1 回答
788 浏览
提问于 2025-04-17 19:20

我的代码

 def myCaller(self, event):


    wx.CallAfter(self.msgbox(0.3434, 0.34, 0.121))



 def msgbox(self, val, f1, f2):

    message = "Node Failure Probability: %f \nLeft Child Value: %f \nRight Child Value: %f" % (val, f1, f2)

    dlg = wx.MessageDialog(self, message, "Node Information", wx.OK)
    dlg.showmodal()
    dlg.Destroy()

输出结果看起来没问题,但在命令行中出现了一个错误:

     dlg.ShowModal()
     File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 711, in ShowModal
return _windows_.Dialog_ShowModal(*args, **kwargs)
    wx._core.PyAssertionError: C++ assertion "wxAssertFailure" failed at ..\..\src\common\wincmn.cpp(2571) in DoNotifyWindowAboutCaptureLost(): window that captured the mouse didn't process wxEVT_MOUSE_CAPTURE_LOST

我哪里出错了呢?提前谢谢你们!

1 个回答

1

问题不在你展示的代码里,而是在调用它的代码上,或者说是在你选择调用它的时机上。没有具体知道你是从哪里调用的,这很难确认,但你肯定是在某个事件处理程序中调用它,而这个事件处理是在鼠标被捕获的时候。显示消息对话框会打断鼠标的捕获,导致你看到的警告。

有两种解决办法:要么修改捕获鼠标的组件,让它能处理捕获失败的情况,要么在这个时候不显示 wx.MessageDialog。如果你是在C++层面而不是Python层面做的修改,前者可能会比较难,但你可以尝试更新到wxPython 2.9.4,看看问题是否已经解决。后者则很简单,只需要使用 wx.CallAfter 就可以了。

撰写回答