Проблемы с переключением фреймов с tkinter - PullRequest
0 голосов
/ 29 мая 2020

Я реализую GUI с Tkinter, следуя этому топу c: Переключение между двумя кадрами в tkinter

Пытаюсь адаптировать его к моей проблеме:

Это контроллер:

class App(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title('VOICED/UNVOICED SPEECH DETECTION')
        self.resizable(RESIZABLE, RESIZABLE)
        self.geometry(str(WIDTH_WINDOW) + 'x' + str(HEIGHT_WINDOW))
        self.configure(bg=BACK_GROUND_COLOR)
        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 (HomePage, MenuPage, GraphicPage):
            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("HomePage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

Это домашняя страница, которая показывает боковую полосу:

enter image description here

И соответствующий код:

class HomePage(tk.Frame):
def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    self.bg = BACK_GROUND_COLOR

    label = tk.Label(self, text="This is the start page", font=controller.title_font)
    label.pack(side="top", fill="x", pady=10)

    # -----------ROOT WINDOWS-------------

    self.configure(bg=BACK_GROUND_COLOR)
    self.position = 0

    # ----------Menu Bar-------------------------

    self.menu_frame = tk.Frame(master=self, height=HEIGHT_WINDOW, width=50,
                               borderwidth=5, relief='groove', highlightbackground="black",
                               highlightcolor="black", highlightthickness=1, bg=BACK_GROUND_COLOR).place(x=0, y=0)
    # Menu Button
    self.menu_img = tk.PhotoImage(file='frontend/Widget/icons/menu.png')
    self.menu_button = tk.Button(master=self.menu_frame, image=self.menu_img,
                                 height=25, width=25,
                                 command=lambda: controller.show_frame("MenuPage"),
                                 bg=BACK_GROUND_COLOR).place(x=10, y=10)

    # Back Button
    self.back_img = tk.PhotoImage(file='frontend/Widget/icons/back.png')
    self.back_button = tk.Button(master=self.menu_frame, image=self.back_img, height=25, width=25,
                                 bg=BACK_GROUND_COLOR).place(x=10, y=46)

    # Home Button
    self.home_img = tk.PhotoImage(file='frontend/Widget/icons/home.png')
    self.home_button = tk.Button(master=self.menu_frame, image=self.home_img, height=25, width=25,
                                 bg=BACK_GROUND_COLOR).place(x=10, y=82)

Когда я нажимаю кнопку меню (первая на боковой панели), я получаю опцию меню (которую я назвал MenuPage):

enter image description here

И соответствующий код:

    class MenuPage(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)

            self.controller = controller
            self.bg = BACK_GROUND_COLOR

            # --------------------------------------------------toolbar--------------------------------------

            self.toolbar_frame = tk.Frame(master=self, height=70, width=WIDTH_WINDOW - 54,
                                          borderwidth=5, relief='groove', highlightbackground="black",
                                          highlightcolor="black",
                                          highlightthickness=1, bg=BACK_GROUND_COLOR).place(x=51, y=0)

            self.button_graphics_img = tk.PhotoImage(file='frontend/Widget/icons/graphic.png')
            self.button_graphic = tk.Button(master=self, text='Test/Train',
                                            image=self.button_graphics_img, height=25, width=25, bg=BACK_GROUND_COLOR,
                                            command=lambda: controller.show_frame("GraphicPage")).place(x=75, y=5)

            self.label_graphic = tk.Label(master=self, text='Plot Parameters',
                                          height=0, width=12, bg=BACK_GROUND_COLOR).place(x=55, y=40)

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

Любые предложения будут оценены.

Заранее спасибо

ОБНОВЛЕНИЕ:

Разместив боковую панель в главном Windows, Я решил тот факт, что при открытии меню пропадала боковая панель.

Другая проблема:

Как мне сделать со стрелкой назад вернуться к предыдущему кадру? Например, если я открою другую страницу с помощью кнопки в MenuPage, а затем захочу вернуться с этой страницы на MenuPage, что мне делать? Я уже пытался переставить кнопки на странице, открытой из меню, изменив команду, чтобы открыть предыдущую страницу (поставив lambda: controller.show_frame("MenuPage")), но не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...