ttk.Progressbar 進度條
Progressbar 進度條是 tkinter 的 ttk 加強模組裡的元件,可以向使用者提供程式執行的進度,這篇教學會介紹如何在 tkinter 中使用 Progressbar 進度條。
快速導覽:
因為 Google Colab 不支援 tkinter,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
加入 Progressbar
一開始先載入 tkinter 和 ttk 模組,建立 tkinter 視窗物件後,透過 Progressbar 方法,就能在視窗物件中建立 Progressbar 進度條,必要的參數有兩個,第一個表示要加入的視窗物件,第二個是進度條的模式,下方的程式碼執行後,會在視窗裡加入一個模式為「載入中 indeterminate」的進度條 ( 位置、大小和顏色都使用預設值,根據作業系統的不同,進度條的樣式也會有所不同 )。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
bar = ttk.Progressbar(root)
bar.pack(pady=20)
bar.start(100)
root.mainloop()
Progressbar 參數設定
加入 Progressbar 之後,可以透過 Progressbar 的參數操作進度與顯示模式,下方列出 Progressbar 的相關參數:
參數 | 說明 |
---|---|
orient | 進度條的方向,可設定 horizontal ( 水平,預設 ) 或 vertical ( 垂直 )。 |
length | 進度條的長度,單位 px。 |
mode | 進度條的模式,可設定 determinate ( 確定,預設 ) 或 indeterminant ( 不確定 )。 |
maximum | 進度條最大值,預設 100。 |
value | 進度條目前數值。 |
variable | 進度條綁定的變數。 |
Progressbar 操作方法
透過下列方法,可以進行 Progressbar 進度條的相關操作:
方法 | 參數 | 說明 |
---|---|---|
start() | interval | 進度條開始運作,interval 為進度條動畫間隔時間,預設 50 ( ms )。 |
stop() | 停止進度條。 | |
step() | delta | 每次進度條的增加值,預設 1。 |
點擊按鈕,增加進度
透過設定 Progressbar 的 value 屬性,就透過進度條顯示指定的進度,下方的程式碼搭配 Button 按鈕與 Label 標籤,執行後只要點擊按鈕,就會不斷以 10 的間距增加數值,直到 100 為止。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
bar = ttk.Progressbar(root, mode='determinate')
bar.pack(pady=10)
a = 0 # 設定 a 從 0 開始
def show():
global a # 設定 a 是全域變數
if a< bar['maximum']:
a = a + 10 # 如果 a 小於進度條的最大值
bar['value'] = a # 設定進度條 value 為 a
val.set(f'{a}%') # Lable 變數設為 a
val = tk.StringVar()
val.set('0%')
label = tk.Label(root, textvariable=val)
label.pack()
button = tk.Button(root, text='增加進度', command=show)
button.pack()
root.mainloop()
透過迴圈改變進度條
下方的程式搭配了 for 迴圈以及 time 函式庫,點擊按鈕時,就能讓進度條自動增加 ( 注意!如果使用 for 迴圈,必須要使用 update() 方法才能更新視窗內容! )
import tkinter as tk
from tkinter import ttk
import time
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
bar = ttk.Progressbar(root, mode='determinate')
bar.pack(pady=10)
def show():
button['state'] = 'disabled' # 進度條開始時,不能點擊按鈕
button2['state'] = 'disabled' # 進度條開始時,不能點擊按鈕
for i in range(101):
bar['value'] = i # 每次迴圈執行時改變進度條進度
val.set(f'{i}%') # 每次迴圈執行時改變顯示文字
root.update() # 更新視窗內容 ( 很重要! )
time.sleep(0.01)
button2['state'] = 'normal' # 進度條結束始時,可以點擊「重來」按鈕
def clear():
button['state'] = 'normal' # 點擊重來按鈕時,「開始」按鈕可以點擊
button2['state'] = 'disabled' # 點擊重來按鈕時,不能點擊「重來」按鈕
bar['value'] = 0 # 進度條設為 0
val.set('0%') # 顯示文字為 0%
val = tk.StringVar()
val.set('0%')
label = tk.Label(root, textvariable=val)
label.pack()
button = tk.Button(root, text='開始', command=show)
button.pack()
button2 = tk.Button(root, text='重來', command=clear, state='disabled')
button2.pack()
root.mainloop()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~