2016-10-23 67 views
1

我一直在为此苦苦挣扎了一段时间。我想我错过了一些简单的信息,我希望你们能帮我解决这个问题。在tkinter中一次只显示一帧

我想让tkinter显示不同的框架,我最终将小部件放在里面。下面是我所做的:

  1. 我做了应该初始化窗口,使所有的不同的帧的程序将运行的类。

  2. 我为每一帧制作了一个单独的类(我打算在程序完成时让变量与不同的类关联),并且分配了一个变量来启动该类并使其运行init函数

  3. 我通过告诉它tkraise()我想要显示的框架结束了StartUp类,这就是事情停止正常工作的地方。

我每一帧设置为不同的颜色,所以当你运行这个程序,你会发现它们分割屏幕空间了,而不是一个被上升到顶部。我错过了什么?最后一点,我故意试图在我的程序中拼出所有东西,我更好地学习这种方式。我离开了它,所以我必须在每个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() 

回答

0

当你这样做pack(side='top', ...)top并不是指含有小部件的顶部,它是指在含有小部件的任何空白区域的顶部。 Page最初占用了所有的空间,然后当您打包Page2时,它会变得低于Page1而不是分层叠加在上面。

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

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