为何Matplotlib动画渲染前被删除?已用plt.show()仍触发警告
问题分析与解决
警告出现的核心原因
你的代码存在两个关键错误,直接导致了该警告:
1. plt.show()放置位置错误
你把plt.show()写在了动画的更新函数plot内部。plt.show()是阻塞式调用,会暂停程序直到关闭绘图窗口。这意味着动画刚触发第一次更新就会被卡住,后续动画循环完全无法执行,动画对象还没完成渲染就被提前销毁,从而触发警告。
2. 变量名冲突
你将FuncAnimation的实例赋值给了变量plot,但你的更新函数也叫plot——这会直接覆盖原来的更新函数。动画后续尝试调用更新逻辑时,实际调用的是被覆盖的动画实例,导致动画逻辑混乱,最终被垃圾回收机制清理,触发警告。
修正后的代码
import subprocess import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation def update_plot(i): print(1) MyOut = subprocess.Popen("pytr portfolio", stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout,stderr = MyOut.communicate() chart_data = [] days = [] t = 0 new_char = stdout.split() netValue = float(new_char[new_char.index(b'netValue') + 2]) # 用with语句优化文件操作,自动处理文件关闭 with open('netValue.txt','a') as file: file.write(f"{netValue}\n") with open('netValue.txt','r') as file: for line in file: t += 1 chart_data.append(float(line)) days.append(t) print(days) plt.cla() plt.plot(days,chart_data) plt.title('depot_performance') # 给动画实例换个不冲突的变量名 anim = FuncAnimation(plt.gcf(), update_plot, interval=1000) # 仅在最后调用一次plt.show(),启动动画循环 plt.show()
额外优化提示
- 使用
with语句操作文件,避免手动关闭文件时可能出现的遗漏或错误。 - 显式指定
FuncAnimation的interval参数名,提升代码可读性。
内容的提问来源于stack exchange,提问作者Din
相关产品推荐
相关产品推荐

