Jednym ze sposobów jest ułożenie ramek jeden na drugim, a następnie możesz po prostu unieść jeden nad drugim w kolejności układania. Ten na górze będzie tym, który jest widoczny. Działa to najlepiej, jeśli wszystkie ramki są tego samego rozmiaru, ale przy odrobinie pracy można je dostosować do pracy z dowolnymi rozmiarami klatek.
Uwaga: dla tej pracy, wszystkie widżety na stronie musi mieć tej strony (tj: self
) lub potomka jako rodzica (lub kapitana, w zależności od terminologii wolisz).
Oto trochę contrived przykład, aby pokazać ogólną koncepcję:
import tkinter as tk # python 3
from tkinter import font as tkfont # python 3
#import Tkinter as tk # python 2
#import tkFont as tkfont # python 2
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")
# the container is where we'll stack a bunch of frames
# on top of each other, then the one we want visible
# will be raised above the others
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
# put all of the pages in the same location;
# the one on the top of the stacking order
# will be the one that is visible.
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()
Jeśli okaże koncepcję tworzenia instancji w klasie mylące, czy różne strony trzeba różne argumenty podczas budowy, możesz jawnie wywoływać każdą klasę osobno. Pętla służy głównie do zilustrowania punktu, w którym każda klasa jest identyczna.
Na przykład, aby utworzyć klasy indywidualnie można usunąć pętlę (for F in (StartPage, ...)
z tym:
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")
biegiem czasu ludzie prosić inne pytania przy użyciu tego kodu (lub samouczek online, który skopiowany ten kod) jako punkt wyjścia może chcesz przeczytać odpowiedzi na te pytania.
Wow, dziękuję bardzo. Tak jak pytanie akademickie, a nie praktyczne, ile z tych stron będzie ukrytych jedna na drugiej, zanim zacznie tracić na znaczeniu i nie będzie reagować? –
Nie wiem. Prawdopodobnie tysiące.Łatwo byłoby przetestować. –
@BryanOakley świetna odpowiedź, jeśli mam widok drzewa, na przykład, pageTwo i chcesz zaktualizować, gdy niektóre dane są wypełnione na pageOne, jak mogę wywołać metodę lub funkcję w pageTwo, aby zaktualizować widok drzewa. – diego