2014-01-08 102 views
1

我正在研究一個需要多個窗口的程序,第一個出現的是登錄窗口,我使用Toplevel小部件來使其他窗口成爲其子窗口,但是此代碼始終顯示兩個窗口一個。Python Tkinter Toplevel

from Tkinter import Frame, Toplevel 
from ttk import Label, Entry, Button 


class loginWindow(Toplevel): 
    def __init__(self): 
     Toplevel.__init__(self) 
     self.title("Title") 
     self.frame = Frame(self) 
     self.frame.pack() 
     self.__make_layout() 
     self.mainloop() 

    def __make_layout(self): 
     self.frame.user_name_label = Label(text="User name:") 
     self.frame.user_name_text = Entry() 
     self.frame.user_name_label.grid(row=0, column=0) 
     self.frame.user_name_text.grid(row=0, column=1) 
     self.frame.password_label = Label(text="Password:") 
     self.frame.password_text = Entry() 
     self.frame.password_label.grid(row=1, column=0) 
     self.frame.password_text.grid(row=1, column=1) 
     self.frame.login_button = Button(text="Login")# , command=self.__create_window) 
     self.frame.login_button.grid(row=2, column=0, columnspan=2) 


if __name__ == '__main__': 
    win1 = loginWindow() 

回答

2

所有_make_layout創建的構件都是無父創建的。這意味着他們是默認根目錄的子項。您需要將父母傳遞給他們中的每個人,方法與Frame相同。像這樣:

self.frame.user_name_label = Label(self.frame, text="User name:") 
self.frame.user_name_text = Entry(self.frame) 
# etc. 

當我運行你的確切代碼時,我沒有第二個窗口,在任何我試過的平臺上。我得到的最接近的是OS X,其中窗口菜單中出現默認根窗口的條目,但窗口本身仍然不出現,並且小部件全部結束於Toplevel(儘管不在您想要的Frame上他們)。但對於Tkinter來說,在這裏展示第二個窗口並將其中的一些或所有小部件放在其上是合法的。

2

這必須是一個平臺相關的問題,因爲abarnert沒有多個窗口的問題。我使用的OS X與XQuartz和下面的代碼給了我兩個窗口:

from Tkinter import Toplevel, Tk 
Toplevel().mainloop() 

然而,這段代碼給了我一個窗口:

from Tkinter import Toplevel, Tk 
Tk().mainloop() 

我相信你的第一個窗口應該被宣佈Tk()和隨後的窗口應該是Toplevel()

+0

你甚至可以如何讓Tkinter編譯爲X11而不是Aqua?這停止了​​我多個版本前工作... – abarnert

+0

我使用的是Anaconda 2.7。 –

+0

瘋狂......無論如何,我可以在Windows上使用cygwin Python和X11來複制它。所以我想問題是,無論Tkinter如何隱藏未使用的主窗口,都可以在Aqua和Windows上以及至少一個現代GNOME X11系統上工作......但在所有X11系統上都不適用,可能特別包括XQuartz或Cygwin委託一些窗口管理到本地窗口管理器? – abarnert

相關問題