Python动画人物窗口无法自动关闭

Python动画人物窗口无法自动关闭,python,animation,matplotlib,plot,Python,Animation,Matplotlib,Plot,使用创建并保存动画时,尝试通过以下方式关闭“体形”窗口时会出现错误: Python版本: Python 2.7.12 | Anaconda自定义(64位)|(默认值,2016年7月2日,17:42:40) IPython 4.1.2——增强的交互式Python 目前我改用PyCharm 2017.1社区版。当从IPython中的%cpaste或%paste运行时,或者使用Shift+Alt+E在PyCharm的交互控制台中运行时,可以在IPython和PyCharm中直接复制错误消息。使用的电影

使用创建并保存动画时,尝试通过以下方式关闭“体形”窗口时会出现错误:

Python版本:

Python 2.7.12 | Anaconda自定义(64位)|(默认值,2016年7月2日,17:42:40)
IPython 4.1.2——增强的交互式Python

目前我改用PyCharm 2017.1社区版。当从IPython中的
%cpaste
%paste
运行时,或者使用Shift+Alt+E在PyCharm的交互控制台中运行时,可以在IPython和PyCharm中直接复制错误消息。使用的电影编码器是集成在mplayer中的mencoder,因为这是安装在我工作场所的默认编码器

注:

  • 在IPython中,首先使用
    plt.ion()
    打开交互模式(默认情况下已在PyCharm中打开)
  • 当使用鼠标中键直接粘贴到IPython屏幕时,IPython中的代码将无错误地退出
  • 单独键入所有命令时,以及粘贴(
    %cpaste
    %paste
    )除
    plt.close()
    之外的所有命令时,IPython或PyCharm中的代码都会无误退出,然后手动键入
    plt.close()
  • 当用
    plt.clf()
    替换
    plt.close()
    时,代码会无误地退出,但我需要
    plt.close()
    ,例如,在需要从头开始重新创建图形的具有不同参数的循环中创建动画
  • 在脚本中从头到尾运行代码时(非交互模式),代码将无错误地退出
  • 在关闭图形窗口时,用鼠标单击窗口按钮,代码将无误退出
  • plt.close()之前插入
    time.sleep(1)
    时,代码退出,出现错误,因此问题可能与代码中的时间冲突无关
下面给出了一个最小、完整且(希望)可验证的示例:

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

# animation function for random image data
def animate_random_data(i):
    new_data = np.random.rand(10, 10)
    # update the data
    im.set_data(new_data)

# initialize the graph
first_data = np.random.rand(10,10)
im = plt.imshow(first_data,interpolation='none')
myfig = plt.gcf()

# create the animation and save it
ani = animation.FuncAnimation(myfig, animate_random_data, range(10), 
                              interval=100)
ani.save('animation_random_data.mpg', writer='mencoder')
plt.close()
错误回溯(来自PyCharm):


尽管如上面列表所示,当手动关闭窗口时,程序会继续运行而不会出错,但这是一个恼人的错误(想想循环中的多个动画)。该错误也会出现,例如1D线图。感谢您的帮助(以及澄清此错误消息的确切含义)

错误来自关闭人像时仍在运行的动画。虽然在大多数情况下,关闭人像时会自动停止动画,但在交互模式下似乎不是这样

解决方案可以是明确停止动画并在关闭图形之前将其删除

ani = animation.FuncAnimation(...)
ani.save(...)
ani.event_source.stop()
del ani
plt.close()

在这种情况下,您可以使用退出()退出程序。

退出将不允许循环中出现多个动画,如问题所述。有趣的是,
ani.event\u source.stop()
在直接键入动画时以交互模式停止动画,而在粘贴时则不允许。如果之后使用了
del ani
,在粘贴的情况下,动画将在特定帧处停止。也可以考虑,如果没有<代码> DEL ANN/<代码>,代码> PLT.Clutel()/Case>仍然会给出与以前相同的错误,但包括两行的工作。注释已被接受为答案,因为所提出的方法用于防止错误消息。但是,我仍然不明白,为什么在关闭窗口之前停止动画是不够的。
ani = animation.FuncAnimation(...)
ani.save(...)
ani.event_source.stop()
del ani
plt.close()