Bunun bir yolu, çerçeveleri üst üste yığmaktır, daha sonra istifleme sırasında birini diğerinin üzerine kaldırabilirsiniz. Üstteki, görünen kişi olacaktır. Bu, tüm çerçevelerin aynı boyutta olması durumunda en iyi sonucu verir, ancak küçük bir çalışma ile herhangi bir boyuttaki çerçeveyle çalışmasını sağlayabilirsiniz.
Not : Bunun çalışması için, bir sayfanın tüm widget'larının o sayfaya (yani self
:) veya bir üst öğe olarak (veya tercih ettiğiniz terminolojiye bağlı olarak ana) bir alt öğeye sahip olması gerekir .
İşte size genel konsepti göstermek için yapmacık bir örnek:
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()
Bir sınıfta örnek oluşturma kavramını kafa karıştırıcı bulursanız veya farklı sayfalar oluşturma sırasında farklı argümanlara ihtiyaç duyarsa, her sınıfı ayrı ayrı açıkça çağırabilirsiniz. Döngü, esas olarak her sınıfın aynı olduğu noktasını göstermeye yarar.
Örneğin, sınıfları ayrı ayrı oluşturmak için döngüyü kaldırabilirsiniz ( for F in (StartPage, ...)
bununla:
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")
Zamanla insanlar bu kodu (veya bu kodu kopyalayan çevrimiçi bir öğreticiyi) başlangıç noktası olarak kullanarak başka sorular sordular. Şu soruların cevaplarını okumak isteyebilirsiniz: