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

如何通过关闭按钮彻底关闭含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:23:13