问题描述
我有你可以在底部找到的代码。基本上我想要做的是将一个数字从 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 (将#修改为@)