Tkinter 进度条

Salman Mehmood 2024年2月15日
  1. Tkinter 中的进度条组件
  2. 在 Tkinter 中使用确定进度条
  3. 在 Tkinter 中使用不确定的进度条
  4. 在 Tkinter 进度条中使用文本
Tkinter 进度条

在这个演示中,我们将学习如何在 Tkinter 中以多种方式创建进度条。

Tkinter 中的进度条组件

进度条组件分析用户正在进行的用户任务。我们在几个地方查看这个组件,例如在安装或其他 GUI 应用程序过程中。

这个组件可以开发成两种模式,确定模式和不确定模式。当进程在确定模式下完成时,该组件可让你分析进度。

此模式按递增顺序显示进度。

在不确定模式下,我们可以看到动画使用这个组件来假设正在发生的事情。在这种模式下,光标在组件的边缘之间来回跳跃。

在 Tkinter 中使用确定进度条

from tkinter import *
from tkinter import ttk

gui = Tk()
gui.title("Delftstack")
gui.geometry("600x400")


def progress():
    # increment of progress value
    progress_var["value"] += 20


# create an object of progress bar
progress_var = ttk.Progressbar(gui, orient=HORIZONTAL, length=400, mode="determinate")
progress_var.pack(pady=30)
btn = Button(gui, text="progress", command=progress)
btn.pack(pady=30)
gui.mainloop()

进度条是 ttk 类的一个组件。我们可以使用 Progressbar() 类来使用这个组件。

这个类接受多个参数。

  1. parent:GUI 窗口的根。
  2. orient:此参数指定方向。我们可以设置两个值,HORIZONTALVERTICAL
  3. length:可以使用此属性调整长度。
  4. mode:该属性接受两种模式,determinateindeterminate

在这种情况下,我们用一个按钮来控制进度条。每当按下按钮时都会调用 progress() 函数,该值将增加 20%。

确定进度条

Progressbar 类有不同的方法。该代码使用了 start()stop() 方法。

start() 方法包含值,stop() 方法包含零个参数。

from tkinter import *
from tkinter import ttk

gui = Tk()
gui.title("Delftstack")
gui.geometry("600x400")


def StartProgress():
    # start progress
    progress_var.start(10)


def StopProgress():
    # stop progress
    progress_var.stop()


# create an object of progress bar
progress_var = ttk.Progressbar(gui, orient=HORIZONTAL, length=400, mode="determinate")
progress_var.pack(pady=30)
btn = Button(gui, text="progress", command=StartProgress)
btn.pack(pady=30)

btn2 = Button(gui, text="stop", command=StopProgress)
btn2.pack(pady=30)
gui.mainloop()

输出:

确定进度条 - 开始和停止

在 Tkinter 中使用不确定的进度条

from tkinter import *
from tkinter import ttk

gui = Tk()
gui.title("Delftstack")
gui.geometry("600x400")


def StartProgress():
    # start progress
    progress_var.start(10)


def StopProgress():
    # stop progress
    progress_var.stop()


# create an object of progress bar
progress_var = ttk.Progressbar(gui, orient=HORIZONTAL, length=400, mode="indeterminate")
progress_var.pack(pady=30)
btn = Button(gui, text="progress", command=StartProgress)
btn.pack(pady=30)

btn2 = Button(gui, text="stop", command=StopProgress)
btn2.pack(pady=30)
gui.mainloop()

此示例与前面的示例类似,但其类型不同。这个进度条 indeterminate 模式以动画模式显示状态,让你知道那里正在发生一些事情,但你无法确定进度到哪里。

不确定的进度条

在 Tkinter 进度条中使用文本

此代码演示了如何使用 Label() 组件获取价值。

代码遵循这些步骤。

  1. 不幸的是,没有文本功能来显示进度条的进度,所以我们创建了一个 stringvar 变量,它接受字符串值并将其设置在标签中。Label() 组件将显示进度条的值。

  2. StartProgress() 函数会增加进度条的状态。在这个函数中,循环被包裹,它将迭代 5 次。
    在每次迭代中,进度条的状态都会增加 20%。set() 方法在字符串中设置当前状态,get() 帮助获取 stringvar 的值。

  3. update_idletasks() 方法将更新状态。每次迭代都有 1 秒的延迟。

  4. 调用 StopProgress() 方法时,状态将重置为零。

from tkinter import *
from tkinter import ttk
import time

gui = Tk()
gui.title("Delftstack")
gui.geometry("600x400")


def StartProgress():
    for i in range(5):
        progress_var["value"] += 20
        stringvar.set(progress_var["value"])
        # get the value
        label.config(text=stringvar.get() + " %")
        # update value
        gui.update_idletasks()
        time.sleep(1)


def StopProgress():
    # stop progress
    progress_var.stop()
    # set zero percent
    stringvar.set("00.0 %")
    label.config(text=stringvar.get())


# create an instance of progress bar
progress_var = ttk.Progressbar(gui, orient=HORIZONTAL, length=400, mode="determinate")
progress_var.place(x=30, y=20)
start_btn = Button(gui, text="Next", command=StartProgress)
start_btn.place(x=30, y=50)
# string variable
stringvar = StringVar()
stringvar.set("00.0 %")
cancel_btn = Button(gui, text="Cancel", command=StopProgress)
cancel_btn.place(x=400, y=50)
label = Label(gui, text=stringvar.get(), font=("", 12))
label.place(x=430, y=25)
gui.mainloop()

输出:

Tkinter 进度条中的文本

点击这里阅读官方 Python 文档。这里的另一个资源

作者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn