如何使用 TKinter 创建软件加载窗口?

Posted

技术标签:

【中文标题】如何使用 TKinter 创建软件加载窗口?【英文标题】:How to create a software loading window with TKinter? 【发布时间】:2022-01-05 10:26:53 【问题描述】:

使用 Tkinter 如何创建一个小的软件加载窗口?一个窗口,硬加载比如7秒然后自动打开软件,比如home.py文件。

如何在 7 秒后自动打开另一个窗口?谢谢

from tkinter import *
from tkinter import ttk
import tkinter as tk
import time

root =  Tk()
root.title("load")
root.geometry("300x300")
root.state("normal")

lbl = Label(root, text="EXAMPLE", font=("Calibri 15 bold"))
lbl(x=40, y=40)


def wait_and_go():
    time.sleep(7)
    

【问题讨论】:

我建议您创建一个ttk.Progressbar 并使用通用小部件after() 方法随时更新它。 与您的想法相反,*** 不是免费的编码服务,也不是要取代现有的教程或文档。见What topics can I ask about here? @Zankaclowski 你的意思是 7 秒的加载动画吗? tkinter 需要运行 mainloop 才能工作 - 它创建窗口,从系统获取鼠标/键事件,将它们发送到小部件,并在窗口中重绘小部件,并在 loop 中执行此操作。如果您使用sleep(),那么这个loop 将无法工作,您将看不到任何东西,或者它被冻结了。您必须在 7 秒后使用 after(7000, func) 来运行 func(),这个 func() 应该可以满足您的需求。 【参考方案1】:

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()

【讨论】:

以上是关于如何使用 TKinter 创建软件加载窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Tkinter 窗口无法调整大小?

如何使点击事件通过tkinter窗口?

python - 如何在Python的Tkinter模块中使对话框窗口出现在最前面?

如何在python tkinter中按下按钮之前使窗口状态空闲?

如何在 tkinter 中创建一个自调整大小的按钮网格?

如何使按钮逐渐出现在tkinter中