tkinter 多次调用页面会弄乱布局

问题描述

我有你可以在底部找到的代码。基本上我想要做的是将一个数字从 StartPage 传递到 PageOne,在那里我需要设置与我传递的数字一样多的小部件。所以,我设法做到了,但是如果我回到家,然后再次按下按钮,您会看到布局与之前的通话混合在一​​起。所以我想创建一个“back_frame”方法,在那里我传递新页面(我想去的地方)和旧页面(我所在的地方)。但是无论是 pack_forget 还是 .delete() 它都可以工作(删除它会完全删除页面,并且应用程序由于处理帧的方式而停止正常工作。 有人可以帮我吗?

import tkinter as tk                # python 3
from tkinter import font as tkfont
from typing_extensions import Intvar  # python 3

class SampleApp(tk.Tk):

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

        self.labels_finanziatori = {
        'principale': [],'capitale_investito': [],'tasso': [],'tempo': []
        }
        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 (StartPage,PageOne):
            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("StartPage")

    def show_frame(self,page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()
        # notify frame that it is raised via virtual event
        frame.event_generate("<<Raised>>")
    
    def back_frame(self,page_name,old_frame):
        '''Show a frame for the given page name'''
        old_frame = self.frames[old_frame]
        old_frame.pack_forget()
        frame = self.frames[page_name]
        frame.tkraise()
        # notify frame that it is raised via virtual event
        frame.event_generate("<<back>>")
        

    def get_page(self,classname):
        '''Returns an instance of a page given it's class name as a string'''
        for page in self.frames.values():
            if str(page.__class__.__name__) == classname:
                return page
        return None


class StartPage(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller
        label = tk.Label(self,text="Start Page: insert value",font=controller.title_font)
        label.pack(side="top",fill="x",pady=10)

        self.some_input = tk.StringVar()
        self.some_entry = tk.Entry(self,width=8) 
        self.some_entry.pack()
        self.some_input = self.some_entry.get()
        button1 = tk.Button(self,text='Next Page',command=lambda: controller.show_frame("PageOne"))
        button1.pack()

class PageOne(tk.Frame):

    def __init__(self,parent)
        self.controller = controller      
        # save a reference of 'StartPage'
        self.start_page = self.controller.get_page('StartPage')
        # use instance variable 'self.label' instead of local variable 'label'
        self.label = tk.Label(self,font=self.controller.title_font)
        self.label.pack(side="top",pady=10)
        # Event Driven: quando chiamo la pagina con show_page il bind permette di farle sapere che è stata chiamata
        # Il riferimento ed il bind permettono di passare correttamente il numero di utenti che si vuole istanziare
        self.bind("<<Raised>>",self.on_raised)
        button = tk.Button(self,text="Go to the start page",command=lambda: self.controller.back_frame("StartPage","PageOne"))
        button.pack() 

    def on_raised(self,event):
        self.controller.labels_finanziatori['principale']=[]
        self.bind("<<Raised>>",self.on_raised)
        self.label.config(text=f"This is page 1,the value stored is '{self.start_page.some_entry.get()}'")      
        for i in range(0,int(self.start_page.some_entry.get())): 
        #MAIN label del finanziatore
            self.controller.labels_finanziatori['principale'].append(tk.Label(self,text="Dati finanziatore numero "+str(i+1) +":\n"))
            self.controller.labels_finanziatori['principale'][i].pack()
        tk.Button(self,text="forget",command = self.pack_forget()).pack()
        self.bind("<<back>>",self.back)
        
if __name__ == "__main__":
    app = SampleApp()
    app.mainloop() ```

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)