tkinter菜单栏切换帧代码触发RecursionError递归深度超限错误如何解决
Tkinter菜单栏切换帧递归错误解决方案
错误原因
- 类继承逻辑冲突:你定义
myApp继承了Tk类,又额外创建了独立的root = Tk()主窗口实例,同时myApp的__init__方法没有调用父类Tk的初始化方法,导致tkinter内部窗口实例管理混乱,触发无限递归。 self.nowFrame属性未初始化,第一次调用switchFrame方法时访问不存在的属性会触发异常。- 方法名拼写错误:销毁组件的方法是
destroy(),你写成了destory()。 - 自定义Frame类初始化时未指定master参数,导致Frame默认绑定到错误的窗口实例。
修正后代码
from tkinter import * # 不再继承Tk,避免重复创建主窗口实例 class myApp: def switchFrame(self, frameClass): if self.nowFrame: self.nowFrame.destroy() # 实例化Frame时指定master为当前主窗口 self.nowFrame = frameClass(master=self.root) self.nowFrame.pack() def __init__(self, root): self.root = root # 初始化当前帧属性 self.nowFrame = None myMenu=Menu(root) menu1=Menu(myMenu) menu1.add_command(label="before", command=lambda:self.switchFrame(frameClass_1)) menu1.add_command(label="next", command=lambda:self.switchFrame(frameClass_2)) myMenu.add_cascade(label="switch", menu=menu1) root.config(menu=myMenu) # 默认显示第一帧 self.switchFrame(frameClass_1) root.mainloop() class frameClass_1(Frame): def __init__(self, master=None, **kwargs): super().__init__(master, **kwargs) Label(self, text="frame1").pack() class frameClass_2(Frame): def __init__(self, master=None, **kwargs): super().__init__(master, **kwargs) Label(self, text="frame2").pack() root = Tk() myApp(root)
核心修改说明
- 移除了
myApp对Tk的继承,避免重复创建主窗口实例,直接用传入的root作为主窗口。 - 新增
self.nowFrame = None初始化属性,避免第一次调用时访问不存在的属性。 - 修正了
destroy方法的拼写错误。 - 给自定义Frame类新增
master参数,实例化时明确指定父容器,避免组件绑定错误。 - 将Frame类的实例化放到
switchFrame内执行,保证每次切换都创建绑定到当前主窗口的新帧。
内容的提问来源于stack exchange,提问作者조영민
相关产品推荐
相关产品推荐

