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

如何捕获处理创建Tkinter窗口的无限递归函数并避免程序挂起?

解决tkinter递归创建窗口后input()挂起的问题

递归创建大量tkinter.Tk()实例后,即便捕获了RecursionError,这些独立的根窗口仍会占用系统资源,且tkinter的底层事件处理会阻塞主线程,导致后续的input()无法正常获取控制台输入,最终引发桌面冻结。

以下两种方案可解决该问题,保留input()调用并让Python继续运行:

方案1:记录窗口实例并批量销毁

通过列表记录所有创建的窗口,捕获异常后逐一销毁,并终止tkinter的事件循环:

import tkinter

windows = []

def infinite_windows():
    window = tkinter.Tk()
    windows.append(window)
    infinite_windows()
    
try:
    infinite_windows()
except RecursionError as e:
    print("caught the exception!")
    print(e)
    # 销毁所有创建的窗口
    for win in windows:
        try:
            win.destroy()
        except Exception:
            pass
    # 终止tkinter事件处理循环
    tkinter.quit()

input("hi there")  # 可正常运行

方案2:使用Toplevel替代Tk()(更优)

按照tkinter规范,一个程序应仅存在一个Tk()根窗口,后续窗口用Toplevel作为子窗口。销毁主根窗口时,所有子窗口会自动关闭:

import tkinter

# 创建隐藏的主根窗口
root = tkinter.Tk()
root.withdraw()

def infinite_windows():
    # 创建依附于主窗口的子窗口
    window = tkinter.Toplevel(root)
    infinite_windows()
    
try:
    infinite_windows()
except RecursionError as e:
    print("caught the exception!")
    print(e)
    # 销毁主窗口,所有子窗口自动关闭
    root.destroy()
    tkinter.quit()

input("hi there")  # 可正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:42:10