使用面向对象设计方法,定义一个tk.Tk派生类 AppView 作为容器。这个容器来放置所有页面,和切换页面。
定义一个tk.Frame派生类作为页面容器,在页面容器中继续放置button、label等实现具体的业务GUI功能。
# -*- coding: utf-8 -*-import tkinter as tk from tkinter import ttk# 设置全局字体样式 LARGE_FONT = ("Verdana", 12)# 定义一个tk.Tk派生类 class AppView(tk.Tk):def __init__(self):super().__init__()self.name ="Class: Application(tk.Tk)"self.wm_title("多页面切换程序")# 创建一个容器框架来放置所有页面self.container = tk.Frame(self)self.container.pack(side="top", fill="both", expand=True)# 同一个容器内,使用布局方法必须相同self.container.grid_rowconfigure(0, weight=1)self.container.grid_columnconfigure(0, weight=1)# 初始化页面框架字典self.pages = {}for F in (StartPage, PageOne, PageTwo, PageThree):frame = F(self.container, self)self.pages[F] = frameframe.grid(row=0, column=0, sticky="nsew")# 显示起始页面 self.show_page(StartPage)# 创建工具栏 Frameself.toolbar_frame = tk.Frame(self, bg='gray')self.toolbar_frame.pack(side=tk.BOTTOM, fill=tk.X)# 同一个容器内,使用布局方法必须相同# 创建按钮并绑定页面切换命令 self.create_toolbar_buttons()def show_page(self, cont):frame = self.pages[cont]frame.tkraise()def create_toolbar_buttons(self):self.button1 = ttk.Button(self.toolbar_frame, text="去到第一页", command=lambda: self.show_page(PageOne)).pack(side=tk.LEFT) # 同一个容器内,使用布局方法必须相同self.button2 = ttk.Button(self.toolbar_frame, text="去到第二页", command=lambda: self.show_page(PageTwo)).pack(side=tk.LEFT) # 同一个容器内,使用布局方法必须相同self.button3 = ttk.Button(self.toolbar_frame, text="去到第三页", command=lambda: self.show_page(PageThree)).pack(side=tk.LEFT)# 同一个容器内,使用布局方法必须相同self.button4 = ttk.Button(self.toolbar_frame, text="去到主页面", command=lambda: self.show_page(StartPage)).pack(side=tk.LEFT)# 同一个容器内,使用布局方法必须相同def print_class(self):print(self.name) # 定义一个tk.Frame派生类(以StartPage为例,其他页面类似) class StartPage(tk.Frame):def __init__(self, parent, root):self.name ="Class: StartPage(tk.Tk)"super().__init__(parent)label = tk.Label(self, text="这里是主页", font=LARGE_FONT)label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class()def print_class(self):print(self.name) # 类似地定义PageOne, PageTwo, PageThree(省略以避免重复)# 定义一个tk.Frame派生类,class PageOne(tk.Frame): class PageOne(tk.Frame):def __init__(self, parent, root):self.name = "Class: StartPage(tk.Tk)"super().__init__(parent)label = tk.Label(self, text="这里是1页", font=LARGE_FONT)label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class()def print_class(self):print(self.name)# 定义一个tk.Frame派生类,class PageTwo(tk.Frame): class PageTwo(tk.Frame):def __init__(self, parent, root):super().__init__(parent)self.name = "Class: StartPage(tk.Tk)"label = tk.Label(self, text="这里是2页", font=LARGE_FONT)label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class()def print_class(self):print(self.name)# 定义一个tk.Frame派生类,class PageThree(tk.Frame): class PageThree(tk.Frame):def __init__(self, parent, root):super().__init__(parent)self.name = "Class: StartPage(tk.Tk)"label = tk.Label(self, text="这里是3页", font=LARGE_FONT)label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class()def print_class(self):print(self.name)if __name__ == '__main__':app = AppView()app.mainloop()