Python 在Canopy中的函数内使用matplotlib.animation

Python 在Canopy中的函数内使用matplotlib.animation,python,matplotlib,enthought,Python,Matplotlib,Enthought,当使用Canopy 1.4.1中的%run语句执行时,以下脚本生成一个简单的正弦波移动动画: import numpy as np from matplotlib import pyplot as plt from matplotlib import animation def animator(): fig = plt.figure() ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) line, = ax.plot([], [], l

当使用Canopy 1.4.1中的
%run
语句执行时,以下脚本生成一个简单的正弦波移动动画:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

def animator():
    fig = plt.figure()
    ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
    line, = ax.plot([], [], lw=2)

    def init():
        line.set_data([], [])
        return line,

    def animate(i):
        x = np.linspace(0, 2, 1000)
        y = np.sin(2 * np.pi * (x - 0.01 * i))
        line.set_data(x, y)
        return line,

    anim = animation.FuncAnimation(fig, animate, init_func=init,
                                frames=200, interval=20, blit=True)

    plt.show()

animator()
但是,如果删除最后一行,使用
%run
运行脚本并从解释器调用
animator()
,屏幕上只绘制第一帧。为什么会这样?如何获得函数调用以在Corpody中生成动画

奇怪的是,这个问题在IDLE或IPython(PyLab)中都没有发生,在这两种情况下,从解释器调用
animator()
都可以正常工作。更重要的是,问题仅限于交互式显示:如果我在
animator
中添加几行代码,以mp4格式保存动画,则即使从Canopy也可以正确保存mp4文件


上面的代码基于的教程。

我已经找到了问题第二部分的答案:按照建议,我必须具有函数
返回动画。但我仍然有点困惑,为什么Canopy和其他口译员在这里表现不同。(为什么闲置和PyLab工作?)任何洞察都将不胜感激

可能Canopy使用的matplotlib设置与IDLE或PyLab不同(例如交互模式)。正如您引用的答案所示,问题代码的行为未定义,因为它依赖于已删除的对象,并且可用于垃圾收集。默认情况下,Canopy将pylab与Qt graphics后端一起使用。标准的pylab快捷方式、命令提示符下的pylab以及IDLE都使用较旧的Wx后端。当行为未定义时,不同的图形后端行为不同,这并不奇怪。也许Qt比Wx更现代,性能更高,垃圾收集也更有效。顺便说一句,如果您使用Canopy首选项(Python选项卡)将后端从Qt更改为Wx,您会发现Canopy也会像其他两个环境一样显示图形。这与后端有关,而与环境无关。BTW2:产生您想要的结果的错误代码几乎不“工作”,运行代码的环境几乎不“工作”或“不工作”,这取决于结果是否符合您的预期。这取决于垃圾收集的调用。@JonathanMarch抱歉,我想我只是阻止了你发布答案。