time.sleep(5)是在GUI有时间更新之前启动的,这就是为什么顶层只在5秒钟后出现的原因。要更正此问题,可以在time.sleep(5)之前添加window.update_idletasks(),以强制更新显示。在
但是,正如Bryan Oakley在他的回答中指出的,GUI在time.sleep(5)执行时被冻结了。我想您的最终目标不是执行time.sleep,而是一些耗时的操作。因此,如果您不想冻结GUI,但不知道执行需要多长时间,您可以在一个单独的线程中执行函数,并使用after定期检查函数是否完成:import Tkinter as tk
import time
import multiprocessing
def function():
time.sleep(5)
def button_1():
window = tk.Toplevel(master)
window.title("info")
msg = tk.Message(window, text='running...', width=200)
msg.pack()
thread = multiprocessing.Process(target=function)
thread.start()
window.after(1000, check_if_running, thread, window)
def check_if_running(thread, window):
"""Check every second if the function is finished."""
if thread.is_alive():
window.after(1000, check_if_running, thread, window)
else:
window.destroy()
master = tk.Tk()
frame = tk.Frame(width=500,height=300)
frame.grid()
button_one = tk.Button(frame, text ="Launch", command=button_1)
button_one.grid(row = 0, column = 0, sticky = "we")
master.mainloop()