tkinter(类似于 Python 和其他语言中的所有其他 GUI)需要运行特殊的 loop 才能工作。此循环创建窗口,从系统获取鼠标/键事件,将它们发送到小部件,并在窗口中重绘小部件,并且一次又一次地这样做。为此,您需要root.mainloop()。
如果您使用sleep(),则此loop 将无法工作,您将看不到任何内容或冻结。但是tkinter 可以使用root.after(7000, func) 在7 秒后运行func(),而这个func() 应该可以满足您的要求。
import tkinter as tk # PEP8: `import *` is not preferred
# --- function ---
def func():
print('Now I can run something else')
#root.destroy()
# --- main ---
root = tk.Tk()
lbl = tk.Label(root, text="EXAMPLE")
lbl.pack(padx=50, pady=50) # padx=(50,0), pady=(50,50)
root.after(7000, func) # function's name without `()`
root.mainloop()
您也可以使用after() 重复运行功能,可以更改标签中的文本和倒计时时间。
import tkinter as tk # PEP8: `import *` is not preferred
# --- function ---
def func():
print('Now I can run something else')
root.destroy() # close window
def update_label():
global counter # inform function to assign new value to external/global variable
counter -= 1
lbl['text'] = f'COUNTDOWN: {counter} s'
if counter > 0:
root.after(1000, update_label)
# --- main ---
counter = 7 # this is global variable
root = tk.Tk()
lbl = tk.Label(root, text=f'COUNTDOWN: {counter} s')
lbl.pack(padx=50, pady=50) # padx=(50,0), pady=(50,50)
root.after(7000, func) # function's name without `()`
root.after(1000, update_label) # function's name without `()`
#update_label()
root.mainloop()
编辑:
以ttk.Progressbar 为例。
import tkinter as tk # PEP8: `import *` is not preferred
import tkinter.ttk as ttk
# --- function ---
def func():
print('Now I can run something else')
root.destroy() # close window
# --- main ---
root = tk.Tk()
pb = ttk.Progressbar(root, maximum=7.001)
pb.pack(padx=50, pady=50) # padx=(50,0), pady=(50,50)
pb.start(1000) # start and change every 1000ms
#pb.step(-1) # move back one step (to 0) because `start()` moves automatically to `1`
root.after(7000, func) # function's name without `()`
root.mainloop()