编辑:
呸,终于找到了关于运行时错误的讨论,虽然它侧重于使用我当时没有安装的 PythonWin。安装 PythonWin 并设置 GTK(根据前面的问题)后,我仍然遇到错误。这里讨论板的解决方案是在 for 循环之后附加 plt.close() 。这似乎有效。
然而:
从命令行,窗口在绘图时仍然不可移动。退出时,PyEval_RestoreThread 不再运行到 NULL tstate。在绘图时允许窗口移动会很好。
原帖:
注意:从命令行运行时会遇到描述的所有问题。从 IDLE Shell (-n) 运行时会遇到类似的怪癖,如“附加的,可能不相关的信息”部分所述。
我的代码正确地绘制了一条线,并且在绘制后立即得到:
“致命的 Python 错误:PyEval_RestoreThread:NULL tstate
此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”
代码如下:
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 中,每个绘图都正确显示,而窗口不可移动
提前感谢您的任何建议/建议。