Python/Tkinter:多个窗口依次打开(并共享信息?)



我正在尝试将两个窗口与 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时,看看这个线程

最新更新