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

如何在另一个类中raise Frame?遇‘frame未定义’错误求助

解决跨类raise Frame的未定义错误

问题根源

  1. self.container_menu未定义:container_menu是PageOne类的实例属性,但你在App类中从未实例化PageOne,自然无法访问该属性。
  2. 错误调用类方法:直接用Page.raise_frame()调用类方法,但raise_frame是实例方法,且未传入正确的目标实例。

修复步骤

  1. 在App中实例化PageOne:将PageOne的实例添加到主界面,让App能访问到它的属性。
  2. 修正按钮的command逻辑:通过PageOne的实例调用raise_frame,或直接对container_menu执行tkraise()实现显示。

修改后的完整代码

import tkinter as tk
import ttkbootstrap as ttk
from gui_elements import ButtonFrame, EntryFrame, TreeviewFrame, FrameFrame, NotebookFrame, ThemeSelector, Page


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry("1000x800")

        self.frame_main = FrameFrame(self)
        self.frame_main.pack(side=tk.LEFT,expand=True, fill=tk.BOTH)
     
        self.theme = ThemeSelector(self.frame_main)
        self.theme.pack()

        self.entry_frame = EntryFrame(self.frame_main)
        self.entry_frame2 = EntryFrame(self.frame_main)
        self.entry_frame.pack()
        self.entry_frame2.pack()

        self.notebook_frame = NotebookFrame(self.frame_main)
        self.notebook_frame.pack()

        self.treeview_frame = TreeviewFrame(self.frame_main)
        self.treeview_frame.pack()

        # 实例化PageOne并添加到主框架
        self.page_one = PageOne(self.frame_main)
        self.page_one.pack(expand=True, fill=tk.BOTH)
        # 默认隐藏container_menu,点击按钮再显示
        self.page_one.container_menu.lower()

        # 修正按钮command:通过PageOne实例访问container_menu并raise
        self.btn_raise = ttk.Button(
            self.frame_main, 
            text="Raise", 
            command=lambda: self.page_one.container_menu.tkraise()
        )
        self.btn_raise.pack()

class PageOne(Page):
    def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)

       self.container_menu = FrameFrame(self)
       self.container_menu.pack(expand=True, fill=tk.BOTH)

       f1 = FrameFrame(self.container_menu)
       f2 = FrameFrame(self.container_menu)
       f3 = FrameFrame(self.container_menu)
       f4 = FrameFrame(self.container_menu)

       for frame in (f1, f2, f3, f4):
           frame.place(relwidth=1, relheight=1)
        
       # Page1
       btn1 = ButtonFrame(f1, text="Next Page", command=lambda:self.raise_frame(f2))
       btn1.pack()

       # Page2
       btn2 = ButtonFrame(f2, text="Previous Page", command=lambda:self.raise_frame(f1))
       btn2.pack()

       self.raise_frame(f1)

if __name__ == "__main__":
    app = App()
    app.mainloop()

额外说明

  • 如果你Page类中的raise_frame方法是封装了tkraise(),也可以把按钮的command改成lambda: self.page_one.raise_frame(self.page_one.container_menu),效果一致。
  • 代码中默认将container_menu隐藏(lower()),点击按钮后再显示,符合你“raise存储PageOne所有组件的框架”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:40:31