我正在开发一个需要多个窗口的程序,第一个出现的是登录窗口,我使用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()
答案 0 :(得分: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来说,在这里显示第二个窗口并将部分或全部小部件放在其上当然是合法的。
答案 1 :(得分:2)
这必须是一个平台相关的问题,因为abarnert没有多个窗口的问题。我将OS X与XQuartz一起使用,以下代码为我提供了两个窗口:
from Tkinter import Toplevel, Tk
Toplevel().mainloop()
但是,这段代码给了我一个窗口:
from Tkinter import Toplevel, Tk
Tk().mainloop()
我相信您的第一个窗口应该声明Tk()
,后续窗口应该是Toplevel()
。