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

如何在Python的CustomTkinter中实现多页面导航?

问题解决:CustomTkinter多页面导航实现与错误修复

核心错误分析

你的代码存在三个关键问题导致master未定义错误和页面切换失效:

  1. 主窗口类型错误:HomePage继承了CTkFrame,但title()、geometry()是顶层窗口CTk的方法,CTkFrame作为容器组件不具备这些属性。
  2. 页面类初始化缺失参数:Page和Page1的__init__方法未传递master参数给父类CTkFrame,导致初始化时找不到父容器。
  3. 按钮命令绑定错误:command=Page1.show()会在按钮初始化时立即执行方法,而非点击按钮时触发,且未实例化Page1就调用方法。

修正后的完整代码

import tkinter
import tkinter.messagebox
import customtkinter
from PIL import Image
import os

customtkinter.set_appearance_mode("Dark")
customtkinter.set_default_color_theme("green")

class Page(customtkinter.CTkFrame):
    def __init__(self, master):
        super().__init__(master)
    def show(self):
        self.lift()
            
class Page1(Page):
    def __init__(self, master):
        super().__init__(master)
        # 添加Page1测试内容
        self.label = customtkinter.CTkLabel(self, text="这是Page1页面", font=("", 30))
        self.label.pack(pady=200)
        # 返回首页按钮
        self.back_btn = customtkinter.CTkButton(self, text="返回首页", command=self.master.show_home_page)
        self.back_btn.pack(pady=20)

class HomePage(Page):
    def __init__(self, master):
        super().__init__(master)
        
        self.rowconfigure((0), weight=1)
        self.columnconfigure((0), weight=1)
        self.rowconfigure((1, 2), weight=1)     
        self.columnconfigure((1,2), weight=1)   
        self.rowconfigure((3), weight=1)
        
        image_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "images")
        # 捕获图片加载异常,避免程序崩溃
        try:
            self.logoImage = customtkinter.CTkImage(Image.open(os.path.join(image_path, "logo.png")), size=(150, 66))
            self.titleLogo = customtkinter.CTkLabel(master=self, text="", image=self.logoImage)
        except:
            self.titleLogo = customtkinter.CTkLabel(master=self, text="LOGO", font=("", 30))
        self.titleLogo.grid(row=0, column=1, padx=0, pady=0)
        
        # 绑定切换到Page1的命令(注意不要加括号)
        self.categoriesButton = customtkinter.CTkButton(
            master=self, 
            border_width=2, 
            text_color=("gray10", "#DCE4EE"),
            font=("",33), 
            width=150, 
            height=50, 
            text="Categories", 
            command=self.master.show_page1
        )
        self.categoriesButton.grid(row=2, column=0, padx=(50, 50), pady=(0, 40), sticky="nsew", columnspan=3)

class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()
        self.title("IMS")
        self.geometry(f"{1300}x{800}")
        
        # 初始化所有页面实例
        self.home_page = HomePage(self)
        self.page1 = Page1(self)
        
        # 将页面铺满主窗口
        self.home_page.pack(fill="both", expand=True)
        self.page1.pack(fill="both", expand=True)
        
        # 默认显示首页
        self.home_page.show()
    
    def show_home_page(self):
        self.home_page.show()
    
    def show_page1(self):
        self.page1.show()

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

关键修改说明

  • 主窗口重构:创建App类继承CTk作为顶层窗口,所有页面作为CTkFrame嵌入其中,统一管理页面切换逻辑。
  • 页面初始化修正:所有页面类的__init__方法接收master参数并传递给父类,确保每个页面都有明确的父容器。
  • 命令绑定修复:按钮command绑定主窗口的切换方法,避免立即执行,点击时才触发页面切换。
  • 切换逻辑优化:通过lift()方法将目标页面提升到最上层实现切换,主窗口提供统一的切换入口方法。

内容的提问来源于stack exchange,提问作者Yash Rraj Sood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:05:18