Spyder环境下如何让matplotlib动画代码彻底终止运行
问题根源
你代码里写的plt.stop()、exit()无法真正终止matplotlib的动画事件循环:FuncAnimation会按照设定的间隔持续调度animate函数执行,你在函数内部修改局部变量i、调用系统退出方法都不会打断动画的调度逻辑,所以动画看似停了,animate里的print(i)、print(y)还会持续执行,往控制台刷数字。
解决方法
紧急终止当前跑飞的进程
直接在Spyder的控制台处于焦点状态时按Ctrl + C,就能立刻中断当前运行的Python进程,停止控制台输出。
从代码层面修复,彻底避免该问题
不要在动画回调里用exit(),正确的停止方式是调用动画实例的event_source.stop()方法终止调度循环,具体修改点:
- 在
animate函数内声明anim为全局变量,让回调函数能访问到动画实例 - 把原来错误的退出逻辑替换为matplotlib官方支持的动画停止方法,不需要调用
exit()
修改后的退出判断段代码如下:
# 放在animate函数开头 global anim # 替换原来的if y<0判断块 if y<0: anim.event_source.stop() # 终止动画事件调度 plt.close(fig) # 关闭绘图窗口 return line,
修正后完整可运行代码
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np plt.style.use('dark_background') fig = plt.figure() ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50)) line, = ax.plot([], [], lw=2) # 初始化函数 def init(): # 创建空帧 line.set_data([], []) return line, xdata, ydata = [], [] x = 0 y = 0 # 动画帧更新函数 def animate(i): global anim print(i) t = i*0.1 y = 0 x = t if x > 10 and y == 0: i = 0 x = 10 y = t - 10 if y >10 and x == 10: x = 10 - (t-20) y = 10 if (y < 10 or y == 10) and x <= 0 and y!=0: y = 10 - (t-30) x = 0 if y<0: anim.event_source.stop() plt.close(fig) return line, print(y) xdata.append(x) ydata.append(y) line.set_data(xdata, ydata) return line, # 设置图表标题 plt.title('Creating a moving point') # 隐藏坐标轴 plt.axis('off') # 加载动画器 anim = animation.FuncAnimation(fig, animate, init_func=init, frames=500, interval=20, blit=True, repeat=False) plt.show()
注意:在Spyder中运行该代码前,需要先在控制台输入
%matplotlib指令,确保matplotlib交互后端正常加载。
内容的提问来源于stack exchange,提问作者Julian_Morrow
相关产品推荐
相关产品推荐

