我正在尝试将两个窗口与 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类中的销毁函数:
def destroy(self):
self.top.destroy()
(顶部是构造函数中使用的 Tk() )
正如您可能已经猜到的那样,我对此非常陌生,欢迎所有提示/建议:)
虽然我并不是说你的代码必须类似于下面的代码,因为相同的行为可以用一些不同的方式和风格编写,但它会做你想要的。
我在你的代码中看到两三个基本错误。
通过调用Tk()
将主根窗口作为参数传递。 这是错误的,因为应该只有一个 Tk 实例,在您的 tkinter 程序中使用TK()
调用进行。给它一个名称,例如 root,然后使用它们的引用。
其次,您看不到任何东西,因为您永远睡觉而从未调用mainloop()
,您应该这样做,否则您的程序将不会更新 UI,也不会响应事件。
主循环是 tkinter 对Tk
实例的事件循环。因此,使用所有小部件设置完整的 UI,并确保代码到达并结束调用root.mainloop()
语句。
此外,您通常不需要调用sleep()
这是一个阻塞函数。任何阻塞函数也会阻塞主循环,抑制更新和事件接收,直到它返回。
现在遵循一些代码
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()
关于给你的GUI代码一些结构,当你开始学习tkinter时,看看这个线程