在tkinter中一次只显示一个帧

时间:2016-10-23 13:41:32

标签: python tkinter

我一直在努力解决这个问题。我想我错过了一些简单的信息,我希望你们能帮我解决这个问题。

我试图让tkinter显示不同的帧,我最终会将小部件放在其中。这就是我的所作所为:

  1. 我创建了一个应该初始化窗口的类,并使程序运行所有不同的帧。

  2. 我为每个框架创建了一个单独的类(我打算在程序完成时将变量与不同的类关联起来),并分配一个将启动该类的变量并使其运行 init 功能

  3. 我通过告诉它tkraise()我想要显示的帧,以及那些事情停止正常工作的方式结束了StartUp类。

  4. 我将每个帧设置为不同的颜色,因此当您运行此程序时,您将看到它们将屏幕空间分开而不是将其提升到顶部。我错过了什么?

    最后一点,我故意在我的计划中拼出一切,我就这样学得更好。我离开了所以我必须在每个tkinter命令前键入tkinter.blah-blah-blah,这样我就可以轻松识别它们了,我决定不让我的类继承Frame或Tk或其他东西。我试图理解我在做什么。

    import tkinter
    
    class StartUp:
        def __init__(self):
            self.root = tkinter.Tk()
            self.root.geometry('300x300')
    
            self.container = tkinter.Frame(master=self.root, bg='blue')
            self.container.pack(side='top', fill='both', expand=True)
    
            self.page1 = Page1(self)
            self.page2 = Page2(self)
    
            self.page1.main_frame.tkraise()
    
    
    class Page1():
        def __init__(self, parent):
            self.main_frame = tkinter.Frame(master=parent.container, bg='green')
            self.main_frame.pack(side='top', fill='both', expand=True)
    
    
    class Page2():
        def __init__(self, parent):
            self.main_frame = tkinter.Frame(master=parent.container, bg='yellow')
            self.main_frame.pack(side='top', fill='both', expand=True)
    
    
    boot_up = StartUp()
    boot_up.root.mainloop()
    

1 个答案:

答案 0 :(得分:0)

执行pack(side='top', ...)时,top没有引用包含小部件的顶部,它指的是包含小部件中任何空白空间的顶部。 Page最初会占用所有空间,然后当您打包Page2时,它会低于 Page1,而不是在它上面分层。

如果您使用的策略是将一个窗口抬高到另一个窗口之上,则需要使用gridplace将窗口小部件叠加在一起。分层是pack根本无法做到的。

您的另一个选择是在新窗口调用pack_forget之前在当前窗口调用pack