我正在Windows上使用wxPython 3.0构建应用程序,并且在尝试更改现有wx.StaticText控件的标签时看到异常。异常具有高度可重现性,但遗憾的是,我无法创建显示相同行为的测试用例。异常回溯看起来像
Traceback (most recent call last):
[...]
File "...\application\views\markers_panel.py", line 137, in redraw
self.grid_sizer.GetItem(num_cols*(index + 1) + 1).GetWindow().SetLabel(wavelength)
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 9210, in SetLabel
return _core_.Window_SetLabel(*args, **kwargs)
PyAssertionError: C++ assertion "m_hdc" failed at ..\..\src\msw\textmeasure.cpp(64)
in wxTextMeasure::BeginMeasuring(): Must not be used with non-native wxDCs
我正在使用wx.FlexGridSizer作为数据表,为其提供了许多wx.StaticText子项。创建StaticText对象很顺利,但是当我尝试更改其标签(更新显示的数据)时,我得到了这个异常。在OS X中wxPython 2.9.5下,相同的代码工作正常。
我知道在没有任何示例代码的情况下提交崩溃报告的形式很糟糕,但有人能指出我在这里可能出错的方向吗?
答案 0 :(得分:2)
问题结果是我试图从一个线程调用SetLabel
而另一个线程也在修改GUI。解决方案是使用wx.CallAfter()
计划所有GUI更新任务(如this other question的已接受答案中所述)。使用此函数强制更新发生在主线程上,这当然意味着在任何给定时间只能运行一个更新任务。
答案 1 :(得分:1)
这真的很奇怪,使用控件时不应该触发此断言。您是否可能只是使用太多控件,因此耗尽了Windows资源?看看程序在Process Explorer中使用的GDI对象的数量(您可能需要明确启用此列),它看起来是否非常高?
否则我真的不知道是什么导致了这个问题,如果你不能在一个简单的例子中重现它,我看到的唯一调试方法是尝试在你的机器上调试C ++代码。