tkinter: переключение между кадрами работает неправильно - PullRequest
0 голосов
/ 25 сентября 2019

поэтому я написал код для переключения между 2 кадрами, я попробовал метод destroy () и не получил никаких ошибок, но когда я нажимаю кнопку, рамка не уничтожается правильно

import tkinter as tk
from tkinter import font  as tkfont

class SampleApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(StartPage)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()



class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self = tk.Frame(master,width=1200,height=700)
        self.pack()

        self.create_button = tk.Button(self,text='CREATE +',command=lambda: master.switch_frame(Create_list),width=15,height=2)                  # =lambda: master.switch_frame(Create_list)
        self.create_button.place(x=100,y=300)

class Create_list(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self = tk.Frame(master,width=1200,height=700)
        self.pack()

        tk.Label(self, text="Page one", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, text="Go back to start page",
                  command=lambda: master.switch_frame(StartPage)).pack()


if __name__ == "__main__":

    app = SampleApp()
    app.mainloop()

эторезультат, как вы можете видеть, когда я нажимаю кнопку «Создать», он не разрушает, а создает новый кадр прямо под ним:

ВЫХОД

1 Ответ

0 голосов
/ 25 сентября 2019

Проблема в том, что вы переопределяете self как фрейм, который находится в master, а не в самой странице.Вы никогда не должны переопределять self таким образом.Что происходит, когда вы уничтожаете страницу, но все виджеты находятся во втором фрейме.Этот второй кадр находится в master, поэтому он не будет уничтожен при уничтожении страницы.

Если вы действительно хотите рассматривать свою «страницу» как объект, каждый созданный вами виджет на «странице» должен быть дочерним элементом self или одним из его потомков.

Не связанный с этой проблемой, вы используете place.place не приведет к увеличению или уменьшению содержащейся рамки.Если нет очень веской причины использовать place, вам следует использовать pack или grid.Если вы используете place, вы можете установить разумный размер для содержащего виджета.

В следующем примере показан правильный способ создания страницы.Обратите внимание, что он не переопределяет self, но вместо этого помещает все непосредственно в реальное self .Кроме того, он использует pack, а не place.

class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        self.create_button = tk.Button(self,text='CREATE +',
            command=lambda: master.switch_frame(Create_list),
            width=15,height=2)
        self.create_button.pack(side="top")

Кроме того, вам, вероятно, следует использовать соответствующие параметры при упаковке рамки, чтобы она заполняла окно:

self._frame.pack(fill="both", expand=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...