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

如何在Tkinter中实现单窗口页面切换(非新建标签页)

在CustomTkinter中实现同一窗口内的页面切换(非标签页)

要实现同一窗口主区域的内容切换,无需标签页,核心思路是把每个页面封装成独立的CTkFrame,通过控制框架的显示/隐藏完成切换。以下是修改后的完整代码:

import customtkinter

class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()

        self.title("Test")
        self.geometry(f"{800}x{600}")
        self.grid_columnconfigure(1, weight=1)
        self.grid_columnconfigure((2, 3), weight=0)
        self.grid_rowconfigure((0, 1, 2), weight=1)
        
        # 侧边栏框架
        self.sidebar_frame = customtkinter.CTkFrame(self, width=140, corner_radius=0)
        self.sidebar_frame.grid(row=0, column=0, rowspan=4, sticky="nsew")
        self.sidebar_frame.grid_rowconfigure(4, weight=1)
        self.logo_label = customtkinter.CTkLabel(self.sidebar_frame, text="test", font=customtkinter.CTkFont(size=20, weight="bold"))
        self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10))
        
        # 侧边栏按钮
        self.sidebar_button_1 = customtkinter.CTkButton(self.sidebar_frame, command=self.show_page_sim, text="test1")
        self.sidebar_button_1.grid(row=1, column=0, padx=20, pady=10)
        
        self.sidebar_button_2 = customtkinter.CTkButton(self.sidebar_frame, command=self.show_page_data, text="t2")
        self.sidebar_button_2.grid(row=2, column=0, padx=20, pady=10)
        
        self.sidebar_button_3 = customtkinter.CTkButton(self.sidebar_frame, command=self.show_page_live, text="t3")
        self.sidebar_button_3.grid(row=3, column=0, padx=20, pady=10)
        
        # 创建三个页面框架
        self.page_sim = customtkinter.CTkFrame(self)
        self.page_sim.grid(row=0, column=1, rowspan=4, sticky="nsew")
        # Test1页面内容示例
        customtkinter.CTkLabel(self.page_sim, text="这是Test1页面内容", font=customtkinter.CTkFont(size=18)).pack(expand=True)
        
        self.page_data = customtkinter.CTkFrame(self)
        self.page_data.grid(row=0, column=1, rowspan=4, sticky="nsew")
        self.page_data.grid_remove()  # 初始化隐藏
        # t2页面内容示例
        customtkinter.CTkLabel(self.page_data, text="这是t2页面内容", font=customtkinter.CTkFont(size=18)).pack(expand=True)
        customtkinter.CTkButton(self.page_data, text="t2专属按钮").pack(pady=20)
        
        self.page_live = customtkinter.CTkFrame(self)
        self.page_live.grid(row=0, column=1, rowspan=4, sticky="nsew")
        self.page_live.grid_remove()  # 初始化隐藏
        # t3页面内容示例
        customtkinter.CTkLabel(self.page_live, text="这是t3页面内容", font=customtkinter.CTkFont(size=18)).pack(expand=True)
        customtkinter.CTkEntry(self.page_live, placeholder_text="t3输入框").pack(pady=10)
        
        # 默认显示第一个页面
        self.current_page = self.page_sim

    def show_page_sim(self):
        self.current_page.grid_remove()
        self.page_sim.grid()
        self.current_page = self.page_sim
        
    def show_page_data(self):
        self.current_page.grid_remove()
        self.page_data.grid()
        self.current_page = self.page_data
        
    def show_page_live(self):
        self.current_page.grid_remove()
        self.page_live.grid()
        self.current_page = self.page_live

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

关键实现细节:

  • 每个页面都是独立的CTkFrame,布局在主窗口的同一位置(column=1,rowspan=4)
  • 使用grid()显示框架,grid_remove()隐藏框架(隐藏后不占用布局空间)
  • 用current_page变量记录当前显示页面,切换时统一隐藏当前页面再显示目标页面
  • 可在每个页面框架内自由添加组件,各页面完全独立

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:57:02