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

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()

关键修改说明

  1. 导入sys模块用于强制退出进程
  2. 添加on_closing处理函数:
    • plt.close('all'):关闭所有Matplotlib图形,释放占用的资源
    • root.destroy():正常销毁Tkinter窗口组件
    • sys.exit():直接终止Python进程,彻底解决终端残留问题
  3. 在show_collatz_graph开头添加plt.close('all'),每次生成新图前清理旧图形,防止资源泄漏

内容的提问来源于stack exchange,提问作者Kfir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:33