Một cách là xếp chồng các khung lên nhau, sau đó bạn chỉ cần nâng một khung lên trên khung kia theo thứ tự xếp chồng. Cái trên cùng sẽ là cái có thể nhìn thấy được. Điều này hoạt động tốt nhất nếu tất cả các khung có cùng kích thước, nhưng với một chút thao tác, bạn có thể làm cho nó hoạt động với bất kỳ khung có kích thước nào.
Lưu ý : để điều này hoạt động, tất cả các tiện ích con cho một trang phải có trang đó (tức là self
:) hoặc con cháu là trang mẹ (hoặc trang chính, tùy thuộc vào thuật ngữ bạn thích).
Đây là một chút ví dụ có sẵn để cho bạn thấy khái niệm chung:
try:
import tkinter as tk
from tkinter import font as tkfont
except ImportError:
import Tkinter as tk
import tkFont as tkfont
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is the start page", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button1 = tk.Button(self, text="Go to Page One",
command=lambda: controller.show_frame("PageOne"))
button2 = tk.Button(self, text="Go to Page Two",
command=lambda: controller.show_frame("PageTwo"))
button1.pack()
button2.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is page 1", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is page 2", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.pack()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
Nếu bạn thấy khái niệm tạo cá thể trong một lớp khó hiểu hoặc nếu các trang khác nhau cần các đối số khác nhau trong quá trình xây dựng, bạn có thể gọi từng lớp một cách rõ ràng. Vòng lặp phục vụ chủ yếu để minh họa điểm mà mỗi lớp là giống nhau.
Ví dụ: để tạo các lớp riêng lẻ, bạn có thể xóa vòng lặp ( for F in (StartPage, ...)
với điều này:
self.frames["StartPage"] = StartPage(parent=container, controller=self)
self.frames["PageOne"] = PageOne(parent=container, controller=self)
self.frames["PageTwo"] = PageTwo(parent=container, controller=self)
self.frames["StartPage"].grid(row=0, column=0, sticky="nsew")
self.frames["PageOne"].grid(row=0, column=0, sticky="nsew")
self.frames["PageTwo"].grid(row=0, column=0, sticky="nsew")
Theo thời gian, mọi người đã hỏi các câu hỏi khác bằng cách sử dụng mã này (hoặc một hướng dẫn trực tuyến đã sao chép mã này) làm điểm bắt đầu. Bạn có thể muốn đọc câu trả lời cho những câu hỏi này: