Tkinter 進度條

Salman Mehmood 2023年1月30日
  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