如何在另一个类中raise Frame?遇‘frame未定义’错误求助
解决跨类raise Frame的未定义错误
问题根源
self.container_menu未定义:container_menu是PageOne类的实例属性,但你在App类中从未实例化PageOne,自然无法访问该属性。- 错误调用类方法:直接用
Page.raise_frame()调用类方法,但raise_frame是实例方法,且未传入正确的目标实例。
修复步骤
- 在
App中实例化PageOne:将PageOne的实例添加到主界面,让App能访问到它的属性。 - 修正按钮的
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
相关产品推荐
相关产品推荐

