You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib pyplot无法自动关闭并从线程更新重绘问题求助

问题原因

你的代码无法自动更新的核心问题是**plt.show()默认是阻塞式调用**:

  • 当主线程执行到plt.show()时,会停在这里,直到你手动关闭图形窗口,才会继续执行后面的sleep(3)和下一次的Plotter调用。
  • 这就导致程序无法自动完成“关闭旧图→绘制新图”的循环,必须手动干预。
解决方案

修改Plotter函数,使用plt.show(block=False)让窗口非阻塞显示,同时配合plt.pause()确保图形能正常渲染:

import numpy as np
from matplotlib import pyplot as plt 
import threading as th
from time import sleep

Xplot = []
YPlot = []

def RandomXYGen():
    x = np.random.normal(5, .75)
    y = np.random.normal(10, 1.5)
    return x, y

def LoopData():
    while True:
        xdata, ydata = RandomXYGen()
        Xplot.append(xdata)
        YPlot.append(ydata)
        print(xdata, ydata)
        sleep(0.1)

def Plotter(xToPlot, yToPlot):
    plt.close('all')  # 关闭所有旧窗口
    plt.figure()  # 创建新的绘图窗口
    plt.plot(xToPlot, yToPlot)
    plt.show(block=False)  # 非阻塞显示窗口
    plt.pause(0.001)  # 强制渲染图形,避免窗口空白

t = th.Thread(target=LoopData, daemon=True)
t.start()

while True:
    Plotter(Xplot, YPlot)
    sleep(3)
补充说明
  • block=False让plt.show()不再阻塞主线程,程序可以继续执行后续的sleep和循环逻辑。
  • plt.pause(0.001)是为了给Matplotlib足够的时间渲染图形,否则可能出现窗口空白的情况。
  • 每次调用Plotter时先关闭所有旧窗口,再创建新窗口,符合你“关闭旧图打开新图”的需求。

内容的提问来源于stack exchange,提问作者chepox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:35:43