如何从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
相关产品推荐
相关产品推荐

