网上有很多文章介绍进度条Progressbar的基本概念及功能,故这里不再赘述。本文给大家分享一种牛叉实用的进度条运用方法。
首先,我们把进度条封装为一个类,里面包含了两种方法,分别是__init__ 和value。__init__ 函数里定义了进度条的样式,类型,位置等基本信息,value函数定义了进度条走动的具体数值。
例子:
class ProcessBar():
def __init__(self):
self.process = ttk.Progressbar(root, length=200, mode="determinate",maximum=100,orient=tk.HORIZONTAL)
self.process.place(x=100, y=10)
def value(self, per):
self.process["value"] = per
root.update() # root 窗口实时更新
后面在程序主体想进度条走动时,直接调用value方法,并传入合适的数值,即可达到目的。
例:
def start():
count = 10000
for i in range(count):
processbar.value(100*i/count) # 直接调用value方法
但这样会引入一个问题,如果进度条写在循环体中,想实时、精确地更新进度条,会极大影响程序的运算速度(实测可降低50%的运算效率)。关于这一点,好像很多文章并未提及。
我们可以优化下代码,增加一个求余的判断,比如总计循环一万次,通过合理设置余数后,可以降低到每一千次或一百次再更新进度条,这样可以灵活控制更新频率,在UI显示效果和运算效率两者之间寻求平衡点。建议每5~10%更新一次,即总循环次数的5~10%作为求余运算的被除数。
例:
def start():
count = 10000
for i in range(count):
if i % 1000 == 0: # 降低更新频率,取总循环次数的10%作为求余运算的被除数
processbar.value(100*i/count)
processbar.value(100)
整体代码如下:
import tkinter as tk
from tkinter import ttk
class ProcessBar():
def __init__(self):
self.process = ttk.Progressbar(root, length=200, mode="determinate",maximum=100,orient=tk.HORIZONTAL)
self.process.place(x=100, y=10)
def value(self, per):
self.process["value"] = per
root.update()
def start():
count = 10000
for i in range(count):
if i % 1000 == 0: # 降低更新频率
processbar.value(100*i/count)
processbar.value(100)
if __name__ == '__main__':
root = tk.Tk()
root.geometry('320x240')
ttk.Button(root,text="开始",command=start,width=10).place(x=10,y=10)
processbar = ProcessBar()
root.mainloop()