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

如何从tkinter窗口中完全删除matplotlib绘图或tkinter canvas画布

Tkinter嵌入Matplotlib绘图彻底删除的实现方法

问题原因

你使用plt.close(figure1)仅释放了Matplotlib侧的figure对象内存,但承载绘图的Tkinter控件仍然被打包在窗口中,因此视觉上没有任何删除效果。要彻底删除嵌入的绘图需要同时处理Tkinter控件销毁和Matplotlib资源释放两个部分。

额外提示:原示例代码中直接将place()的返回值赋值给按钮变量是错误写法,place()/pack()/grid()均返回None,无法保留按钮实例引用;同时Button需要添加tk.前缀否则会报未定义错误。

正确实现步骤

  • 首先获取FigureCanvasTkAgg实例对应的Tkinter控件,调用destroy()方法将其从窗口中移除,完成视觉层面的删除
  • 再调用plt.close()释放Matplotlib的figure资源,避免内存泄漏
  • 可选:清空不需要的对象引用,进一步释放内存

完整修改代码

import tkinter as tk
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

data1 = {'Country': ['US','CA','GER','UK','FR'],
         'GDP_Per_Capita': [45000,42000,52000,49000,47000]
        }
df1 = DataFrame(data1,columns=['Country','GDP_Per_Capita'])


root= tk.Tk() 
  
figure1 = plt.Figure(figsize=(6,5), dpi=100)
ax1 = figure1.add_subplot(111)
bar1 = FigureCanvasTkAgg(figure1, root)
bar1.get_tk_widget().pack(side=tk.LEFT, fill=tk.BOTH)
df1 = df1[['Country','GDP_Per_Capita']].groupby('Country').sum()
df1.plot(kind='bar', legend=True, ax=ax1)
ax1.set_title('Country Vs. GDP Per Capita')

def close_plot():
    # 第一步:销毁承载绘图的Tkinter控件
    bar1.get_tk_widget().destroy()
    # 第二步:释放Matplotlib figure资源
    plt.close(figure1)
    # 可选:清空引用彻底释放内存
    global bar1, figure1
    bar1 = None
    figure1 = None

tk.Button(root, text='Delete', command = close_plot).place(height=30, width = 100, rely=0.02, relx = 0.4)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:06:04