Используя кнопки в Tkinter для перехода на разные страницы приложения?

У меня есть довольно простой вопрос. В Tkinter (python) мне было интересно, кто будет использовать кнопку для перехода на разные страницы моего приложения, например, на страницу регистрации и страницу входа в систему. Я знаю, что GUI не имеет "страниц", например, веб-сайтов, и видел несколько разных способов, но как лучше всего сделать ссылки на разные страницы?

Спасибо всем!

Ответы

Ответ 1

Сделайте каждую страницу рамкой. Затем все ваши кнопки должны делать, это скрыть все видимое, а затем сделать нужный кадр видимым.

Простым методом для этого является стекирование кадров друг над другом (это один раз, когда place имеет смысл), а затем lift() кадр, который вы хотите видеть. Этот метод лучше всего работает, когда все страницы имеют одинаковый размер; на самом деле это требует, чтобы вы явно задали размер содержащего фрейм.

Ниже приведен надуманный пример. Это не единственный способ решить проблему, просто доказательство того, что это не особенно трудная задача:

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()

Ответ 2

Не могли бы вы сделать что-то подобное?

import tkinter

def page1():
    page2text.pack_forget()
    page1text.pack()

def page2():
    page1text.pack_forget()
    page2text.pack()

window = tkinter.Tk()

page1btn = tkinter.Button(window, text="Page 1", command=page1)
page2btn = tkinter.Button(window, text="Page 2", command=page2)

page1text = tkinter.Label(window, text="This is page 1")
page2text = tkinter.Label(window, text="This is page 2")

page1btn.pack()
page2btn.pack()
page1text.pack()

Мне это кажется намного проще.