如何通过关闭按钮彻底关闭含Matplotlib图表的Tkinter窗口?
解决Tkinter+Matplotlib窗口关闭后进程残留的问题
问题原因
关闭窗口后进程未终止,核心原因有两点:
- Matplotlib的
pyplot模块持有未释放的全局图形对象 - Tkinter默认关闭行为仅隐藏窗口,未彻底销毁所有资源并终止进程
解决方案
方法1:绑定窗口关闭事件,彻底清理资源
给Tkinter窗口添加关闭事件处理函数,确保销毁窗口、关闭Matplotlib图形并退出进程,这是最直接有效的修复方式。
修改后的完整代码示例:
import numpy as np import h5py as h5 import pandas as pd # 先指定Matplotlib使用TkAgg后台,避免默认后台冲突 import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt import matplotlib.colors as colors import tkinter as tk from tkinter import ttk from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) import sys window = tk.Tk() window.title("Plotting data in the hdf5 file") mytabs = ttk.Notebook(window) tab1 = ttk.Frame(mytabs) tab2 = ttk.Frame(mytabs) tab3 = ttk.Frame(mytabs) tab4 = ttk.Frame(mytabs) mytabs.add(tab1, text = "Velocity") mytabs.add(tab2, text = "Momentum Flux") mytabs.add(tab3, text = "Pressure and forcing") mytabs.add(tab4, text = "Diagram") mytabs.pack(expand = 1, fill ="both") ## 读取数据:用with语句自动管理h5文件,避免资源泄漏 with h5.File('your_data.h5', 'r') as f: # 在这里编写数据读取逻辑 pass ## 创建图形示例 fig, ax = plt.subplots(2,2, figsize = (12,12)) # 编写绘图逻辑... fig2, ax2 = plt.subplots(1,1, figsize=(12,12)) fig3, ax3 = plt.subplots(1,1, figsize=(12,12)) fig4, ax4 = plt.subplots(1,1, figsize=(12,12)) def plot(fig,tab): canvas = FigureCanvasTkAgg(fig, master = tab) canvas.draw() canvas.get_tk_widget().pack() toolbar = NavigationToolbar2Tk(canvas, tab) toolbar.update() canvas.get_tk_widget().pack() plot(fig,tab1) plot(fig2,tab2) plot(fig3,tab3) plot(fig4,tab4) # 定义窗口关闭时的处理函数 def on_closing(): window.destroy() plt.close('all') # 关闭所有Matplotlib图形对象 sys.exit() # 强制终止Python进程 # 绑定窗口关闭事件到处理函数 window.protocol("WM_DELETE_WINDOW", on_closing) window.mainloop()
方法2:避免使用pyplot全局状态(更优雅的实现)
改用matplotlib.figure.Figure直接创建独立图形对象,不依赖plt.subplots的全局状态,从根源减少资源残留:
# 替换原来的plt.subplots部分 from matplotlib.figure import Figure # 创建独立的Figure对象,不依赖pyplot全局环境 fig = Figure(figsize=(12,12), dpi=100) ax = fig.subplots(2,2) # 编写绘图逻辑... fig2 = Figure(figsize=(12,12), dpi=100) ax2 = fig2.subplots(1,1) # 其他图形同理创建
这种方式配合方法1的关闭事件处理,能更彻底地释放资源。
额外注意事项
- 所有文件操作(如h5py)务必使用
with语句自动管理,或手动调用close()方法关闭 - 避免在循环中重复创建图形对象,防止资源累积
内容的提问来源于stack exchange,提问作者very_confused
相关产品推荐
相关产品推荐

