2016-10-23 66 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