我已经开始学习python了。enter image description here 我试图制作一个tkinter多帧应用程序。 但输出是这样的。我无法弄清楚为什么"第三页"按钮显示在每一帧,我试图弄清楚,但不能。我是新手。请帮我。 非常感谢。
import tkinter as tk
from tkinter import ttk
Large_Font=("Verdana",16)
class First(tk.Tk):#inherited tk.Tk
def __init__(self, *args,**kwargs):
tk.Tk.__init__(self,*args,**kwargs)
# self.iconbitmap(default='favicon.ico')
tk.Tk.wm_title(self,"First one!")
container = tk.Frame(self)#always have this, frame is predef frame is edge of window
container.pack(side="top",fill="both",expand=True)# fill is for limits you set and expand is to go beyond if needed
container.grid_rowconfigure(0,weight=1)#0 is min value, weight specs priority
container.grid_columnconfigure(0,weight=1)
self.frames={}
for F in (StartPage, PageOne, PageTwo, PageThree):
frame = F(container,self)
self.frames[F]=frame
frame.grid(row=0,column=0,sticky="ew")
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=ttk.Label(self,text="Hello World",font=Large_Font)
label.pack(pady=10,padx=10)
button = ttk.Button(self,text="PageOne", command=lambda: controller.show_frame(PageOne))
button.pack()
button1=ttk.Button(self,text="PageTwo",command=lambda: controller.show_frame(PageTwo))
button1.pack()
button2=ttk.Button(self,text="Page Three",command= lambda: controller.show_frame(PageThree))
button2.pack()
class PageOne(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
label=tk.Label(self,text="Welcome to Page 1",font=Large_Font)
label.pack(pady=10,padx=10)
button = ttk.Button(self,text="To Home", command=lambda: controller.show_frame(StartPage))
button.pack()
button1 = ttk.Button(self,text="To PageTwo", command=lambda: controller.show_frame(PageTwo))
button1.pack()
class PageTwo(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
label=tk.Label(self,text="Welcome to Page 2",font=Large_Font)
label.pack(pady=10,padx=10)
button = ttk.Button(self,text="To Home", command=lambda: controller.show_frame(StartPage))
button.pack()
button1 = ttk.Button(self,text="To PageOne", command=lambda: controller.show_frame(PageOne))
button1.pack()
class PageThree(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
label=ttk.Label(self,text="Graph page",font=Large_Font)
label.pack(pady=10,padx=10)
button = ttk.Button(self,text="To Home", command=lambda: controller.show_frame(StartPage))
button.pack()
button1 = ttk.Button(self,text="To PageOne", command=lambda: controller.show_frame(PageOne))
button1.pack()
app=First()
app.mainloop()
答案 0 :(得分:0)
不同的帧不会完全重叠。如果您为每个帧提供不同的背景颜色,您将能够清楚地看到正在发生的事情。例如:
class PageThree(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent, bg='thistle')
然后为每个页面执行此操作。
因此,要么使页面大小相同,要么使用pack_forget()
。
答案 1 :(得分:0)
变化:
frame.grid(row=0,column=0,sticky="ew")
对此:
frame.grid(row=0,column=0,sticky="nsew")
您所看到的是页面大小不同的结果,因此您可以看到包含按钮3的页面。现在您只设置了东西两侧的粘性,但是在南北方向上您的页面是没有伸展来填补他们的父母。你需要做的就是纠正这个问题就是把棍子固定在各个方向。
您可以使用其他一些指示。每次调用新页面时都可以重建主框架的示例。当您有许多页面或不同类型的内容可供显示时,这可能会有所帮助。
您可以将所有内容都放在一个页面上,只需将标签和按钮更新为新内容即可。
或者你可以做你已经完成的事情并简单地纠正所显示的每个窗口/框架的大小,这样你就不会看到任何重叠。