plt.fignum_exists()在matplotlib子图场景下失效,如何通过它检测绘图窗口关闭状态?
plt.fignum_exists()在matplotlib子图场景下失效,如何通过它检测绘图窗口关闭状态?
嗨,我来帮你捋清楚这个问题~首先你遇到的核心问题是没搞明白plt.fignum_exists()到底需要传什么参数——它要的是图的编号(figure number),而不是你创建的fig对象本身,这也是你之前用它没效果的原因。
第一步:获取你的绘图窗口编号
当你用fig, ax = plt.subplots()(哦对了,你写的plt.subplot()应该是笔误,这个函数返回的是单个轴对象,而plt.subplots()才会返回fig和ax的元组)创建绘图窗口后,每个fig对象都自带一个唯一的编号属性fig.number,你只需要把这个编号传给plt.fignum_exists()就行。
第二步:在循环里检测窗口状态
接下来在你的循环中,每次迭代都检查这个编号对应的窗口是否还存在。如果不存在(也就是用户关闭了窗口),就直接跳出循环,停止程序。
解决“关窗后新窗口自动打开”的问题
你说关闭窗口后会弹出新窗口,大概率是因为你在循环里又执行了创建绘图或者显示窗口的代码(比如重复调用plt.show()或者plt.plot()时没有指定轴)。解决办法是:
- 确保所有绘图操作都绑定到你一开始创建的
ax对象上 - 用
plt.show(block=False)让窗口非阻塞显示,配合plt.pause()来更新画面,不要在循环里重复调用plt.show()
完整代码示例
这里给你一个简单的演示代码,你可以参考着改自己的程序:
import matplotlib.pyplot as plt import numpy as np # 创建绘图窗口,获取窗口编号 fig, ax = plt.subplots() fig_num = fig.number # 初始化数据 x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) line, = ax.plot(x, y) # 设置窗口非阻塞显示 plt.show(block=False) try: while True: # 检查窗口是否存在 if not plt.fignum_exists(fig_num): print("窗口已关闭,停止程序") break # 更新数据(模拟你的循环逻辑) y = np.sin(x + np.pi/10) line.set_ydata(y) ax.relim() ax.autoscale_view() # 更新画面 fig.canvas.draw() plt.pause(0.1) except KeyboardInterrupt: print("手动中断程序")
这样一来,当你关闭绘图窗口时,循环会检测到窗口不存在,自动停止,也不会再弹出新窗口啦。
备注:内容来源于stack exchange,提问作者Fff
相关产品推荐
相关产品推荐

