Переключение между разными фреймами в tkinter - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь научиться работать с фреймами в tkinter, написал это так, что каждая страница - это отдельный класс:

import tkinter as tk


class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Multiple Frames Test")
        self.resizable(False, False)
        StartPage().pack()

    def switch_frames(self, to_remove, to_add):
        to_remove.pack_forget()
        to_add.pack()


class StartPage(tk.Frame, App):

    def __init__(self):
        tk.Frame.__init__(self)
        self.title1 = tk.Label(self, text="This is an awesome label")
        self.title1.grid(row=0, column=0, padx=(20, 20), pady=(20, 20))
        self.switch_btn1 = tk.Button(self, text="Switch to SecondaryPage", command=lambda: self.switch_frames(self, SecondaryPage))
        self.switch_btn1.grid(row=1, column=0, padx=(20, 20), pady=(0, 20))


class SecondaryPage(tk.Frame, App):

    def __init__(self):
        tk.Frame.__init__(self)
        self.title2 = tk.Label(self, text="This is also an awesome label")
        self.title2.grid(row=0, column=0, padx=(20, 20), pady=(20, 20))
        self.switch_btn2 = tk.Button(self, text="Switch to StartPage")
        self.switch_btn2.grid(row=1, column=0, padx=(20, 20), pady=(0, 20))


my_app = App()
my_app.mainloop()

После нажатия кнопки для переключения на SecondaryPage я получаю сообщение об ошибке :

Файл «c: \ Users ...», строка 23, в

self.switch_btn1 = tk.Button (self, text = "Переключиться на SecondaryPage", command = lambda: self.switch_frames (self, SecondaryPage))

Файл «c: \ Users ...», строка 14, в switch_frames

to_add.pack ()

TypeError: pack_configure () отсутствует 1 обязательный позиционный аргумент: 'self'

1 Ответ

0 голосов
/ 20 июня 2020

Вы передаете класс в switch_frames, но switch_frames был разработан для приема экземпляров. Вам нужно сделать одно из двух: либо создать экземпляры обоих классов, а затем передать соответствующие экземпляры функции, либо переопределить switch_frames, чтобы создавать экземпляры по запросу.

Вот как может выглядеть первое решение например:

class App(tk.Tk):

    def __init__(self):
        ...
        self.start_page = StartPage()
        self.secondary_page = SecondaryPage()

        # initially hide the secondary page and show the start page
        self.switch_frames(self.secondary_page, self.start_page)

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

class App(tk.Tk):
    def __init__(self):
        ...
        self.current_page = None
        self.switch_frames(StartPage)
        ...

    def switch_frames(self, new_frame_cls):
        if self.current_page is not None:
            self.current_page.destroy()
        self.current_page = new_frame_cls()
        self.current_page.pack()

Разница между ними состоит в том, что в первом случае вы создаете страницы в начале, а во втором - вы создаете страницу только тогда, когда Вы готовы это показать.

...