Matplotlib,Pylab使用TKAgg:在win32上使用plt.ion()时遇到PyEval_RestoreThread:NULL tstate

时间:2010-10-21 16:08:34

标签: multithreading interactive matplotlib ion

修改

Bah,终于找到了关于运行时错误的讨论,虽然它侧重于使用我当时没有安装过的PythonWin。安装PythonWin并设置GTK后(根据earlier question),我仍然遇到错误。讨论板here的解决方案是在for循环后附加plt.close()。这似乎有效。

然而:

从命令行开始,绘图时窗口仍然无法移动。退出时,PyEval_RestoreThread不再运行到NULL tstate。在绘图时允许窗口移动会很好。


原帖:

注意:从命令行运行时遇到所有描述的问题。从IDLE Shell(-n)运行时遇到类似的怪癖,如“附加的,可能无关的信息”部分所述。

我的代码正确地绘制了一条线,并在绘图后立即得到:

  

“致命的Python错误:PyEval_RestoreThread:NULL tstate
  此应用程序已请求Runtime以不寻常的方式终止它。请联系应用程序的支持团队获取更多信息。“

代码如下:

import matplotlib as mpl  
mpl.use("TKAgg")  
import pylab as plt  
import numpy as np  

Line = mpl.lines.Line2D  
x = np.linspace(-1,1,50)  
y=np.sin(x*np.pi)  

plt.ion()  

fig = plt.gcf()  
ax = fig.gca()  
ax.add_line(Line([x],[y]))  

plt.draw()

注释掉plt.ion()时代码很好,但是没有显示任何内容 虽然plt.show()适用于此示例,但目标是使用交互式通过以下方式创建粗略动画:

import matplotlib as mpl
mpl.use("TKAgg")

import pylab as plt
import numpy as np

plt.ion()

Line = mpl.lines.Line2D

x = np.linspace(-1,1,50)
for i in xrange(10):
    y = (1.0+i/9.0) * np.sin(x*np.pi)
    plt.clf()
    fig = plt.gcf()
    ax = fig.gca()
    ax.add_line(Line([x],[y]))
    plt.draw()

每次迭代都会正确绘制其各自的行,并且循环之后的任何代码都会在致命错误之前运行,这可以通过在for循环之后立即添加以下内容来证明:

raw_input("no error yet: ")
print "here it comes"

我意识到摧毁这个数字然后创建一个新的数字和新的轴可能不是有效的甚至是良好的实践。但是,问题似乎仍然存在于plt.ion()上,因为对其进行注释不会产生任何错误。

如果解决方案有详细记录,并且我已经在我的搜索中通过了它,请随意愤怒地指出这一点,并可能提供这样的链接。如果替代方案遇到了新问题,这将是更优选的。

如果答案是比使用pylab更直接地管理绘图,我非常愿意探索这个选项。

其他可能无关的信息:

  • 在for循环后不使用raw_input()时,运行第二个代码时窗口是不可移动的。
  • 如果使用raw_input(),则可以在绘图后移动窗口,同时程序正在等待raw_input()
  • 从IDLE Shell(-no subprocess)运行时问题是相同的:
    • 绘图时窗口无法移动,但不会遇到致命错误。
    • 即使不使用raw_input()
    • ,也可以在绘图后移动窗口
  • 从命令行或IDLE Shell中,每个绘图都在窗口不可移动时正确显示

提前感谢任何建议/意见。

0 个答案:

没有答案