2013-07-01 51 views
3

我在寫一個具有GUI和不同功能的小應用程序。在目前的佈局我下,它有一個「歡迎」屏幕,該屏幕:Tkinter - 流向不同的窗口

1)需要用戶輸入一些數據,

2)允許用戶啓動預期功能。

然而,「歡迎」屏幕在選擇操作模式後已經達到了它的目的,因此我認爲將其摧毀是正確的。然後程序應該進入所選功能的「主」窗口(這可以產生Toplevel小部件,對話框和其他)。在完成用戶想要做的任何事情之後,如果程序可以返回到最初的「歡迎」屏幕,這將是一個不錯的獎勵。

我的想法是讓「歡迎」和每個「主」窗口爲Tkinter.Tk()實例,因爲在任何給定時刻只有其中一個運行。然而,我聽說有多個Tk()實例,即使不同時運行,對於Tkinter來說也是一個壞主意。

我的問題是:這種方法是否正確,還是應該避免在我的程序中使用多個Tk()實例?如果是這樣,那將是正確的方法嗎?

請注意,我是一位初級程序員,這是我第一次使用圖形用戶界面,而不僅僅是說「hello world」。

謝謝你的時間。

回答

4

既然你想在一次只顯示一個窗口,你可以定義各種「屏幕」爲tk.Frame S和使用lift方法,以顯示正確的框架:

import Tkinter as tk 
class Page(tk.Frame): 
    def __init__(self, master, text, height, width, *args, **kwargs): 
     tk.Frame.__init__(self, *args, borderwidth=20, **kwargs) 
     self.height = height 
     self.width = width 
     button = tk.Button(self, text=text, font=('Comic Sans MS', 20), 
          command=lambda: self.callback()) 
     button.pack(side="top", fill="both", expand=True) 
    def onlift(self): 
     root.geometry('{}x{}'.format(self.width, self.height)) 
     self.lift() 

class App(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 

     p1 = Page(self, 'This is page 1', height=200, width=300) 
     p2 = Page(self, 'Next page is 2', height=400, width=300) 
     p3 = Page(self, 'We love number 3', height=400, width=600) 
     p1.callback = p2.onlift 
     p2.callback = p3.onlift 
     p3.callback = p1.onlift 

     p1.place(x=0, y=0, relwidth=1, relheight=1) 
     p2.place(x=0, y=0, relwidth=1, relheight=1) 
     p3.place(x=0, y=0, relwidth=1, relheight=1) 

     p1.onlift() 

root = tk.Tk() 
app = App(root) 
root.mainloop() 

所以你的情況,您可以定義tk.Frame的其他子類,並使用它們代替Page

+0

真棒例子...謝謝。 –