Tkinter中类作为Frame初始化失败问题求助
问题:Tkinter多Frame页面切换失效,Frame未正确生成
我在开发Tkinter多页面GUI时,遇到Frame无法正确生成、页面切换功能失效的问题。已缩小问题范围,相关代码如下:
main_page.py代码
class main_page(Frame): def __init__(self, root, controller): Frame.__init__(self, root) canvas = Canvas( controller, bg = "#153246", height = 720, width = 1280, bd = 0, highlightthickness = 0, relief = "ridge" ) #canvas.place(x = 0, y = 0) canvas.pack(fill="both", expand=True)
gui.py代码
class gui(Tk): def __init__(self, *args, **kwargs): Tk.__init__(self, *args, **kwargs) container = Frame(self) container.pack(side="top", fill="both", expand=True) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = {} self.curr_frame = None #TODO: This needs to have the figma frames for F in (main_page, account_no_waiver): frame = F(container, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(main_page)
核心问题是frame = F(container, self)虽然构造了Frame,但生成的Frame没有预期内容,无法通过tkraise实现页面切换。
解决方法
1. 修正main_page中Canvas的父组件
把Canvas的父组件从controller改成self(即当前的main_page实例),让Canvas成为Frame的子组件:
class main_page(Frame): def __init__(self, root, controller): Frame.__init__(self, root) canvas = Canvas( self, # 修改此处为self bg = "#153246", height = 720, width = 1280, bd = 0, highlightthickness = 0, relief = "ridge" ) canvas.pack(fill="both", expand=True)
2. 实现show_frame方法(如果未实现)
在gui类中添加show_frame方法,用于切换页面:
class gui(Tk): def __init__(self, *args, **kwargs): # 原有的__init__代码... self.show_frame(main_page) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise()
原因说明
原来的代码中,Canvas直接挂载到了主窗口(controller即gui实例),而非main_page Frame内部,导致main_page本身没有任何可见内容。修改Canvas的父组件后,Canvas会成为Frame的一部分,这样Frame才有实际内容,通过tkraise切换时才能正常显示。
内容的提问来源于stack exchange,提问作者HumboldtSquid
相关产品推荐
相关产品推荐

