尝试在StaticText上调用SetLabel时WX中的断言错误

时间:2014-03-03 16:51:51

标签: wxpython wxwidgets

我正在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下,相同的代码工作正常。

我知道在没有任何示例代码的情况下提交崩溃报告的形式很糟糕,但有人能指出我在这里可能出错的方向吗?

2 个答案:

答案 0 :(得分:2)

问题结果是我试图从一个线程调用SetLabel而另一个线程也在修改GUI。解决方案是使用wx.CallAfter()计划所有GUI更新任务(如this other question的已接受答案中所述)。使用此函数强制更新发生在主线程上,这当然意味着在任何给定时间只能运行一个更新任务。

答案 1 :(得分:1)

这真的很奇怪,使用控件时不应该触发此断言。您是否可能只是使用太多控件,因此耗尽了Windows资源?看看程序在Process Explorer中使用的GDI对象的数量(您可能需要明确启用此列),它看起来是否非常高?

否则我真的不知道是什么导致了这个问题,如果你不能在一个简单的例子中重现它,我看到的唯一调试方法是尝试在你的机器上调试C ++代码。