2013-02-11 8 views
15

Mam tu dość proste pytanie. W Tkinter (python) zastanawiałem się, do kogo użyć przycisku, aby przejść do różnych stron mojej aplikacji, np. Strony rejestru i strony logowania. Mam świadomość, że GUI nie ma "stron" takich jak strony internetowe, widziałem na kilka różnych sposobów, ale jaki jest najlepszy sposób tworzenia linków do różnych stron?Korzystanie z przycisków w aplikacji Tkinter do nawigacji na różnych stronach aplikacji?

Dziękuję wszystkim bardzo!

Odpowiedz

17

Uczyń każdą stronę ramką. Następnie wszystkie przyciski muszą być ukryte, co jest widoczne, a następnie uczynić pożądaną ramkę widoczną.

Prosta metoda polega na układaniu ramek jeden na drugim (jest to jeden raz, gdy ma to sens) Ta technika działa najlepiej, gdy wszystkie strony mają ten sam rozmiar; w rzeczywistości wymaga to wyraźnego ustawienia rozmiaru ramki zawierającej.

Poniżej znajduje się przykładowy przykład. Nie jest to jedyny sposób rozwiązania problemu, wystarczy udowodnić, że nie jest to szczególnie trudny problem do rozwiązania:

import Tkinter as tk 

class Page(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
    def show(self): 
     self.lift() 

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 1") 
     label.pack(side="top", fill="both", expand=True) 

class Page2(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 2") 
     label.pack(side="top", fill="both", expand=True) 

class Page3(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 3") 
     label.pack(side="top", fill="both", expand=True) 

class MainView(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     p1 = Page1(self) 
     p2 = Page2(self) 
     p3 = Page3(self) 

     buttonframe = tk.Frame(self) 
     container = tk.Frame(self) 
     buttonframe.pack(side="top", fill="x", expand=False) 
     container.pack(side="top", fill="both", expand=True) 

     p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 
     p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 
     p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 

     b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) 
     b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift) 
     b3 = tk.Button(buttonframe, text="Page 3", command=p3.lift) 

     b1.pack(side="left") 
     b2.pack(side="left") 
     b3.pack(side="left") 

     p1.show() 

if __name__ == "__main__": 
    root = tk.Tk() 
    main = MainView(root) 
    main.pack(side="top", fill="both", expand=True) 
    root.wm_geometry("400x400") 
    root.mainloop() 
+0

niż ty, dokładnie to, co było po! –

+0

@ CasparWylie: Cały ten przykład oznacza, że ​​cały ten przykład jest jednym blokiem tekstu. Możesz podzielić go na dowolną liczbę plików, co nie ma nic wspólnego z rozwiązaniem. Każda "strona" może z łatwością być własnym modułem. –

+0

@BryanOakley, czy nie byłoby lepiej używać notebooka do takich rzeczy? http://www.tkdocs.com/tutorial/complex.html#notebook – user3885927