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

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,提问作者조영민

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:15:03