2014-03-03 43 views
0

我建立在Windows上使用wxPython的3.0的应用程序,我看到一个异常,而试图更改现有wx.StaticText控制的标签。这个异常是高度可重复的,但不幸的是我还没有能够创建一个显示相同行为的测试用例。唯一的例外回溯看起来像断言错误当试图调用SetLabel一个静态文本

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

我知道这是一个糟糕的形式提交崩溃报告没有任何示例代码,但任何人都可以指向我的方向可能是错误吗?

回答

1

的问题竟然是,我是想叫SetLabel从一个线程,而另一个线程也被修改GUI。解决方案是使用wx.CallAfter()(如this other question的接受答案中所述)安排所有GUI更新任务。使用此功能会强制更新发生在主线程上,这当然意味着在任何给定时间只能运行一个更新任务。

0

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

否则我真的没有什么可能会造成这样的想法,如果你无法重现这一个简单的例子来调试它的唯一途径我看到的是试试你的机器上调试C++代码。