如何捕获处理创建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
相关产品推荐
相关产品推荐

