Python tkinter-多帧

时间:2018-06-15 17:29:40

标签: python user-interface tkinter

我已经开始学习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()

2 个答案:

答案 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的页面。现在您只设置了东西两侧的粘性,但是在南北方向上您的页面是没有伸展来填补他们的父母。你需要做的就是纠正这个问题就是把棍子固定在各个方向。

您可以使用其他一些指示。每次调用新页面时都可以重建主框架的示例。当您有许多页面或不同类型的内容可供显示时,这可能会有所帮助。

您可以将所有内容都放在一个页面上,只需将标签和按钮更新为新内容即可。

或者你可以做你已经完成的事情并简单地纠正所显示的每个窗口/框架的大小,这样你就不会看到任何重叠。