2014-01-08 69 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

相关问题