关闭含matplotlib图表的tkinter窗口后Python会话无法结束的解决办法
Tkinter嵌入Matplotlib后窗口关闭进程残留问题解决
问题描述
在Tkinter界面中嵌入Matplotlib图表,程序运行时功能正常,但点击窗口默认的“X”关闭按钮后,终端进程始终无法终止;手动添加的Exit按钮(调用sys.exit())可以正常结束进程,单独使用root.destroy()也无法解决问题。
使用的代码如下:
import tkinter as tk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import sys root = tk.Tk() fig = plt.figure(figsize=(4,4)) ax = fig.add_subplot() line, = ax.plot([1,2,3],[1,4,9]) canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False) toolbar.update() canvas.get_tk_widget().pack() toolbar.pack() tk.Button(root, text="Exit", command=lambda:sys.exit()).pack() root.mainloop()
环境信息:
- Windows 11 PowerShell 版本 5.1.22621.963
- Python 3.11.1
解决方案
问题根源是Matplotlib的后台线程未随Tkinter窗口关闭而终止,需手动清理Matplotlib资源并终止进程。
修改步骤:
- 定义统一的关闭处理函数,在其中销毁Tkinter窗口、关闭Matplotlib图形并终止进程
- 将窗口的关闭事件绑定到该函数上
修改后的完整代码:
import tkinter as tk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import sys def on_closing(): root.destroy() plt.close('all') # 释放Matplotlib所有图形资源 sys.exit() root = tk.Tk() # 绑定窗口关闭事件到自定义处理函数 root.protocol("WM_DELETE_WINDOW", on_closing) fig = plt.figure(figsize=(4,4)) ax = fig.add_subplot() line, = ax.plot([1,2,3],[1,4,9]) canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False) toolbar.update() canvas.get_tk_widget().pack() toolbar.pack() # 让Exit按钮也调用统一的关闭函数 tk.Button(root, text="Exit", command=on_closing).pack() root.mainloop()
关键说明
plt.close('all'):关闭所有Matplotlib创建的图形实例,彻底释放相关的后台线程与资源sys.exit():确保整个Python进程完全终止,避免残留线程导致进程挂起- 统一关闭逻辑:将窗口默认关闭事件和Exit按钮绑定到同一个函数,保持行为一致
内容的提问来源于stack exchange,提问作者Abel Gutiérrez
相关产品推荐
相关产品推荐

