Python动画图形窗口无法自动关闭

标签 python animation matplotlib plot

使用 matplotlib.animation 创建动画时并保存它,尝试通过 plt.close 关闭图形窗口时出现错误:

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 中退出且不会出现错误
  • 在 IPython 或 PyCharm 中单独键入所有命令以及粘贴(%cpaste%paste)除 plt 之外的所有命令时,代码都会退出,不会出现错误。 close(),然后手动输入 plt.close()
  • plt.close() 替换为 plt.clf() 时,代码退出时不会出现错误,但我需要 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):

Traceback (most recent call last):  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/backends/backend_qt5agg.py", line 176, in __draw_idle_agg
    FigureCanvasAgg.draw(self)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 474, in draw
    self.figure.draw(self.renderer)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/artist.py", line 61, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/figure.py", line 1165, in draw
    self.canvas.draw_event(renderer)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 1809, in draw_event
    self.callbacks.process(s, event)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/cbook.py", line 563, in process
    proxy(*args, **kwargs)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/cbook.py", line 430, in __call__
    return mtd(*args, **kwargs)  
  File "/opt/local/anaconda/anaconda-2.2.0/lib/python2.7/site-packages/matplotlib/animation.py", line 652, in _start
    self.event_source.add_callback(self._step)  
AttributeError: 'NoneType' object has no attribute 'add_callback'

虽然按照上面的列表中所写,手动关闭窗口时程序会继续运行而不会出现错误,但这是一个令人讨厌的错误(想想循环中的多个动画)。该错误也会出现,例如一维线图。感谢您的任何帮助(并澄清此错误消息的确切含义)!

最佳答案

该错误来自于关闭图形时动画仍在运行。虽然在大多数情况下,关闭图形时会自动停止动画,但在交互模式下似乎并非如此。

解决方案可以是在关闭图形之前显式停止动画并删除它。

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

关于Python动画图形窗口无法自动关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43776528/

相关文章:

python - 检测列名称并根据自定义函数创建新列

c# - 线性代数库

python - 如何将 Eigen::Ref 与 pybind11 一起使用?

python - 有没有一种标准的方法来归因于/引用 python 代码?

html - Css 动画无限动画线

ios - 动画不适用于 UITableView deleteRowsAtIndexPaths :withRowAnimation:

animation - 在 D3 动画期间将负载转移到 GPU

python - 读取二进制数据并将数据分布在网格文件Python中

Python Matplotlib Streamplot 提供起点

python - Pandas plotting--忽略时间范围