Salah satu caranya adalah dengan menumpuk bingkai di atas satu sama lain, lalu Anda cukup menaikkan satu bingkai di atas yang lain dalam urutan susun. Yang di atas akan menjadi salah satu yang terlihat. Ini bekerja paling baik jika semua bingkai berukuran sama, tetapi dengan sedikit usaha, Anda dapat membuatnya berfungsi dengan bingkai berukuran berapa pun.
Catatan : agar ini berfungsi, semua widget untuk halaman harus memiliki halaman itu (yaitu:) self
atau turunan sebagai induk (atau master, tergantung pada terminologi yang Anda inginkan).
Berikut ini sedikit contoh yang dibuat untuk menunjukkan kepada Anda konsep umum:
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()
Jika Anda merasa konsep pembuatan instance di kelas membingungkan, atau jika halaman yang berbeda memerlukan argumen yang berbeda selama konstruksi, Anda dapat secara eksplisit memanggil setiap kelas secara terpisah. Perulangan berfungsi terutama untuk menggambarkan poin bahwa setiap kelas identik.
Misalnya, untuk membuat kelas satu per satu, Anda dapat menghapus loop ( for F in (StartPage, ...)
dengan ini:
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")
Seiring waktu orang mengajukan pertanyaan lain menggunakan kode ini (atau tutorial online yang menyalin kode ini) sebagai titik awal. Anda mungkin ingin membaca jawaban atas pertanyaan-pertanyaan ini: