tkinter:在帧之间切换无法正常工作

时间:2019-09-25 17:50:01

标签: tkinter

所以我写了在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()

这是结果,如您所见,当我单击“创建”按钮时,它不会销毁,但会在下面显示新框架:

OUTPUT

1 个答案:

答案 0 :(得分:0)

问题是您将self重新定义为master中而不是页面本身中的框架。您永远不要以这种方式重新定义self。发生的情况是您破坏了页面,但是所有小部件都在第二帧中。第二帧位于主框架中,因此销毁页面时不会销毁它。

如果您确实想将“页面”视为对象,则在“页面”中创建的每个小部件都必须是self的子代或其子代之一。

与该问题无关,您正在使用placeplace不会导致包含框架的增大或缩小。除非有非常令人信服的理由使用place,否则应使用packgrid。如果您确实使用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)