我正在尝试使用两个带有Tkinter的窗口:出现一个欢迎窗口,当单击一个按钮时,另一个窗口打开(欢迎窗口关闭)。但是,目前第一个窗口没有显示,因此程序无法验证条件并转到第二个窗口。 (如果条件不存在则显示,但在这种情况下两个窗口同时出现)
welWindow=New_Toplevel_1(Tk())
#wait until welWindow.getGo()==1
while welWindow.getGo()!=1:
time.sleep(1)
#my variables get values from welWindow's variables
welWindow.destroy()
labWindow=(Tk())
labWindow.mainloop()
我的New_Toplevel_1类中的destroy函数:
def destroy(self):
self.top.destroy()
(top是构造函数中使用的Tk())
你可能已经猜到我对此很新,欢迎提出所有提示/建议:)
虽然我没有说你的代码必须类似下面的代码,因为相同的行为可以用不同的方式和样式编写,它会做你想要的。
我在你的代码中看到了两三个基本错误。
您通过调用Tk()
将主根窗口作为参数传递。这是错误的,因为应该只有一个Tk实例,在你的tkinter程序中使用TK()
调用。给它一个名称,例如root,并使用它们的引用。
其次,你没有看到任何东西,因为你没有调用mainloop()
永远睡觉,你应该,否则你的程序将不会更新UI,也不会响应事件。
mainloop是qzxswpoi实例的tkinter的eventloop。因此,使用所有小部件设置完整的UI,并确保代码到达并结束语句调用Tk
。
此外,您通常不需要调用root.mainloop()
,这是一个阻止功能。任何阻塞功能也会阻止主循环,禁止更新和事件接收,直到它返回。
现在遵循一些代码
sleep()
关于为GUI代码提供一些结构,当你开始学习tkinter时,看看这个from tkinter import ttk, Tk, Toplevel
root = Tk()
welcome_window = Toplevel(root)
welcome_window.title('Welcome')
lab_window = Toplevel(root)
lab_window.title('Lab')
root.withdraw() # hide root window
lab_window.withdraw() # hide lab window
def goto_lab():
welcome_window.destroy()
lab_window.deiconify() # show lab window
button1 = ttk.Button(welcome_window, text='Close',\
command=goto_lab)
button1.pack(padx=100, pady=50)
button2 = ttk.Button(lab_window, text='Close',\
command=quit)
button2.pack(padx=100, pady=50)
root.mainloop()