BottomOfSea模型多帧-如何重新初始化破坏?帧?

问题描述

很抱歉,我感到自己的问题很容易解决,但我什至无法尝试/搜索网络!

我正在做一个基于SeaOfBTCmodel的应用程序,该应用程序包含一个多框架项目。到目前为止,它运行良好(即使我不是100%地确定这是实现目标的最佳方法),但是我确实有一个问题:打开页面时,我希望将其重新初始化。但是,如果我已经使用过它并在输入中输入了一些值,那么当返回同一页面时,这些值仍然会存在。

当用tkraise使帧重新出现时,我不知道如何重新初始化帧。不过,另一种解决方案是在从菜单移至另一帧时破坏框架。

这是我可以用来展示整个机制的最基本的代码

    import tkinter as tk


class SeaOfBTC(tk.Tk):

    def __init__(self,*args,**@R_404_4868@):
        tk.Tk.__init__(self,**@R_404_4868@)

        container = tk.Frame(self)
        container.pack(side='top',fill='both',expand=True)
        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        menubar = tk.Menu(container)
        filemenu = tk.Menu(menubar,tearoff=0)
        filemenu.add_command(label='StartPage',command=lambda: self.show_frame(StartPage))
        filemenu.add_separator()
        filemenu.add_command(label='PageOne',command=lambda: self.show_frame(PageOne))
        menubar.add_cascade(label='Pages',menu=filemenu)
        tk.Tk.config(self,menu=menubar)

        self.frames = {}
        for F in (StartPage,PageOne):
            frame = F(container,self)
            self.frames[F] = frame
            frame.grid(row=0,column=0,sticky='nsew')

        self.show_frame(StartPage)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):

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

        label = tk.Label(self,text="StartPage")
        label.pack(pady=10,padx=10)


class PageOne(tk.Frame):

    def __init__(self,parent)
        label = tk.Label(self,text='PageOne')
        label.pack(pady=10,padx=10)

        my_entry = tk.Entry(self,textvariable='')
        my_entry.pack(padx=10,pady=10)


app = SeaOfBTC()
app.geometry("300x300")
app.mainloop()

我猜可以在show_frame函数解决。 我尝试使用frame.__init__(),但是我收到一条错误消息,要求我提供父级和控制器参数:即使测试了一些东西,我也不知道该使用什么。 如果要使用.destroy(frame),它将不再打开。

预先感谢您对这个问题的帮助,也许您对整体的了解!

祝一切顺利

解决方法

我使用了Stevoisiak提出的方法。看起来可能会导致内存问题,所以我使用了gc模块。 经过一些测试,它看起来可以正常工作。

尽管如此,我仍然不反对使用第一种方法回答我的问题,只是为了理解/学习一些东西!

谢谢大家阅读,