Tkinter窗口关闭后终端仍运行,CTRL+C无法使用求助
解决Tkinter+Matplotlib程序关闭窗口后终端残留的问题
你的问题根源在于关闭Tkinter窗口时,Matplotlib的绘图资源没有被彻底释放,导致Python进程残留,终端无法恢复交互。以下是具体的修复方案:
核心修复点
- 绑定窗口关闭事件,拦截右上角关闭操作,手动清理Matplotlib资源
- 强制退出进程,确保所有后台线程和资源被终止
- 每次生成新图前关闭旧图形,避免资源积累
修改后的代码
import tkinter as tk import sys from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib import pyplot as plt def collatz(n): # Function to calculate the Collatz sequence sequence = [n] while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 sequence.append(n) return sequence def show_collatz_graph(): # 先关闭所有残留的Matplotlib图形,释放资源 plt.close('all') if hasattr(root, 'collatz_plot'): if isinstance(root.collatz_plot, FigureCanvasTkAgg): root.collatz_plot.get_tk_widget().destroy() else: root.collatz_plot.destroy() try: n = int(var.get()) sequence = collatz(n) fig, ax = plt.subplots() ax.plot(sequence, color='white') for spine in ax.spines.values(): spine.set_color('white') ax.set_facecolor("#36393e") fig.set_facecolor("#36393e") ax.xaxis.label.set_color('white') ax.yaxis.label.set_color('white') ax.tick_params(axis='x', colors='white') ax.tick_params(axis='y', colors='white') canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().config(bg='#36393e') canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) root.collatz_plot = canvas except ValueError: canvas = tk.Canvas(root, bg='#36393e', bd=0, highlightthickness=0) canvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1) root.update() canvas_width = canvas.winfo_width() canvas_height = canvas.winfo_height() canvas.create_text(canvas_width/2, canvas_height/2, text="Why are you entering a word dude?\nLike what did I do to you? Why do I deserve this?", fill='white', anchor="center",font=("TkDefaultFont", 30)) root.collatz_plot = canvas def on_closing(): # 关闭所有Matplotlib图形 plt.close('all') # 销毁Tkinter窗口 root.destroy() # 强制退出进程,确保终端恢复 sys.exit() root = tk.Tk() root.geometry('900x900') root.config(bg="#36393e") root.title('Collatz Grapher') # 绑定窗口关闭事件到自定义处理函数 root.protocol("WM_DELETE_WINDOW", on_closing) var = tk.StringVar() entry = tk.Entry(root, font='arial', textvariable=var) btn = tk.Button(root, text='Calculate Collatz', font='arial', bg='#36393e', fg='white', activebackground='#2f3136', activeforeground='white', command=show_collatz_graph) btn.pack(side=tk.BOTTOM,pady=20) entry.pack(side=tk.BOTTOM) root.mainloop()
关键修改说明
- 导入
sys模块用于强制退出进程 - 添加
on_closing处理函数:plt.close('all'):关闭所有Matplotlib图形,释放占用的资源root.destroy():正常销毁Tkinter窗口组件sys.exit():直接终止Python进程,彻底解决终端残留问题
- 在
show_collatz_graph开头添加plt.close('all'),每次生成新图前清理旧图形,防止资源泄漏
内容的提问来源于stack exchange,提问作者Kfir
相关产品推荐
相关产品推荐

