Python之tkinter進(jìn)度條Progressbar用法解讀
Progressbar 基本概念
Progressbar 可以解釋為進(jìn)度條,主要是當(dāng)做一個工作進(jìn)度的指針,在這個控件中會有一個指針,由此指針可以了解工作進(jìn)度
構(gòu)造方法如下:
Progressbar(父對象, options, ...)
參數(shù):
- 第一個參數(shù):父對象,表示這個進(jìn)度條將建立在哪一個窗口內(nèi)
- 第二個參數(shù):
options,參數(shù)如下
| 參數(shù) | 含義 |
|---|---|
| length | 進(jìn)度條的長度默認(rèn)是100像素 |
| mode | 可以有兩種模式,下面作介紹 |
| maximum | 進(jìn)度條的最大值默認(rèn)是100像素 |
| name | 進(jìn)度條的名稱,供程序參考引用 |
| orient | 進(jìn)度條的方向,可以是HORIZONTAL(默認(rèn)) 或者是 VERTICAL |
| value | 進(jìn)度條的目前值 |
| variable | 記錄進(jìn)度條目前的進(jìn)度值 |
mode參數(shù)
determinate:一個指針會從起點(diǎn)移至終點(diǎn),通常當(dāng)我們知道所需工作時間時,可以使用此模式,這是默認(rèn)模式indeterminate:一個指針會在起點(diǎn)和終點(diǎn)間來回移動,通常當(dāng)我們不知道工作所需時間時,可以使用此模式 Progressbar
基本應(yīng)用
例子:
import tkinter
import tkinter.ttk
root = tkinter.Tk()
root.geometry('150x120')
progressbarOne = tkinter.ttk.Progressbar(root)
progressbarOne.pack(pady=20)
# 進(jìn)度值最大值
progressbarOne['maximum'] = 100
# 進(jìn)度值初始值
progressbarOne['value'] = 20
# 橫排 長度200 起點(diǎn)移至終點(diǎn)
progressbarTwo = tkinter.ttk.Progressbar(root, orient=tkinter.HORIZONTAL, length=200, mode='determinate')
progressbarTwo.pack(pady=20)
# 進(jìn)度值最大值
progressbarTwo['maximum'] = 100
# 進(jìn)度值初始值
progressbarTwo['value'] = 80
root.mainloop()運(yùn)行結(jié)果:

注意:現(xiàn)在進(jìn)度條還不能動!
Progressbar 動畫設(shè)計
如果想要設(shè)計含動畫效果的Progressbar,可以在每次更新Progressbar 對象的value值時調(diào)用update()方法,這時窗口可以依據(jù)value值重繪,這樣就可以達(dá)到動畫效果
例子:
import time
import tkinter
import tkinter.ttk
def show():
for i in range(100):
# 每次更新加1
progressbarOne['value'] = i + 1
# 更新畫面
root.update()
time.sleep(0.05)
root = tkinter.Tk()
root.geometry('150x120')
progressbarOne = tkinter.ttk.Progressbar(root)
progressbarOne.pack(pady=20)
# 進(jìn)度值最大值
progressbarOne['maximum'] = 100
# 進(jìn)度值初始值
progressbarOne['value'] = 0
button = tkinter.Button(root, text='Running', command=show)
button.pack(pady=5)
root.mainloop()運(yùn)行結(jié)果:

例子:
模擬真實下載,下載總量是10000B, 每次下載500B
def show():
# 設(shè)置進(jìn)度條的目前值
progressbarOne['value'] = 0
# 設(shè)置進(jìn)度條的最大值
progressbarOne['maximum'] = maxbyte
# 調(diào)用loading方法
loading()
def loading():
# 改變變量屬性
global byte
# 每次運(yùn)行500B
byte += 500
# 設(shè)置指針
progressbarOne['value'] = byte
if byte < maxbyte:
# 經(jīng)過100ms后再次調(diào)用loading方法
progressbarOne.after(100, loading)
root = tkinter.Tk()
root.geometry('150x120')
# 設(shè)置下載初值
byte = 0
# 設(shè)置下載最大值
maxbyte = 10000
progressbarOne = tkinter.ttk.Progressbar(root)
progressbarOne.pack(pady=20)
button = tkinter.Button(root, text='Running', command=show)
button.pack(pady=5)
root.mainloop()運(yùn)行結(jié)果:

Progressbar 的方法 start()/step()/stop()
含義如下:
start(interval):每隔interval時間移動一次指針。interval的默認(rèn)值是50ms,每次移動指針調(diào)用一次step(amount)。在step()方法內(nèi)的amount參數(shù)意義就是增值量step(amount):每次增加一次amount,默認(rèn)值是1.0,在determinate模式下,指針不會超過maximum參數(shù)。在indeterminate模式下,當(dāng)指針達(dá)到maximum參數(shù)值的前一格時,指針會回到起點(diǎn)stop():停止start()運(yùn)行
例子:
import time
import tkinter
import tkinter.ttk
def show():
while progressbarOne.cget('value') <= progressbarOne['maximum']:
progressbarOne.step(2)
root.update()
print(progressbarOne.cget('value'))
time.sleep(0.05)
root = tkinter.Tk()
root.geometry('150x120')
progressbarOne = tkinter.ttk.Progressbar(root, length=200, mode='determinate', orient=tkinter.HORIZONTAL)
progressbarOne.pack(pady=20)
progressbarOne['maximum'] = 100
progressbarOne['value'] = 0
button = tkinter.Button(root, text='Running', command=show)
button.pack(pady=5)
root.mainloop()運(yùn)行結(jié)果:

使用start()方法啟動動畫,單擊stop按鈕停止
例子:
import tkinter
import tkinter.ttk
def run():
progressbarOne.start()
def stop():
progressbarOne.stop()
root = tkinter.Tk()
root.geometry('150x120')
progressbarOne = tkinter.ttk.Progressbar(root, length=200, mode='determinate', orient=tkinter.HORIZONTAL)
progressbarOne.pack(padx=5, pady=10)
progressbarOne['maximum'] = 100
progressbarOne['value'] = 0
buttonRun = tkinter.Button(root, text='Run', width=6, command=run)
buttonRun.pack(padx=10, pady=5, side=tkinter.LEFT)
buttonStop = tkinter.Button(root, text='Stop', width=6, command=stop)
buttonStop.pack(padx=10, pady=5, side=tkinter.RIGHT)
root.mainloop()運(yùn)行結(jié)果:

indeterminate 模式
在這個模式下指針將左右移動,主要目的是讓用戶知道程序仍然在繼續(xù)工作
例子:
progressbarOne = tkinter.ttk.Progressbar(root, length=200, mode='indeterminate', orient=tkinter.HORIZONTAL)
運(yùn)行結(jié)果:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python+Opencv身份證號碼區(qū)域提取及識別實現(xiàn)
這篇文章主要介紹了Python+Opencv身份證號碼區(qū)域提取及識別實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python3中zip()函數(shù)知識點(diǎn)小結(jié)
本文主要介紹了Python3中zip()函數(shù)知識點(diǎn)小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python運(yùn)維自動化psutil模塊的監(jiān)控和管理深入探究
這篇文章主要為大家介紹了Python運(yùn)維自動化psutil模塊的監(jiān)控和管理深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
深入解析NumPy中的Broadcasting廣播機(jī)制
在吳恩達(dá)老師的深度學(xué)習(xí)專項課程中,老師有提到NumPy中的廣播機(jī)制,同時那一周的測驗也有涉及到廣播機(jī)制的題目。那么,到底什么是NumPy中的廣播機(jī)制?本文就來介紹一下2021-05-05
Python和Ruby中each循環(huán)引用變量問題(一個隱秘BUG?)
這篇文章主要介紹了Python和Ruby中each循環(huán)引用變量問題,類似PHP的foreach中使用引用變量的問題,需要的朋友可以參考下2014-06-06

