2

编辑:

呸,终于找到了关于运行时错误的讨论,虽然它侧重于使用我当时没有安装的 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 中,每个绘图都正确显示,而窗口不可移动

提前感谢您的任何建议/建议。

4

0 回答 0