python copy 进度条 python添加进度条_取值


Hello,it's me! 我们又见面了,今天我们来实现利用Python输出动态进度条。

进度条是计算机处理任务或执行任务软件中常用的增强用户体验的重要手段,它能够实时显示任务或软件的执行速度。

先来个简单版本。

利用print()函数实现简单非动态刷新的文本进度条,基本思想就是按照赞任务执行的百分比将整个任务划分为100个小单位,每执行N%就输出一次进度条。每一行输出包含进度百分比,代表已完成的部分(***)和未完成的部分(..)这两张字符,以及一个跟随完成度前进的小箭头(->)。

好,话不多说,我们上代码!

假定我们都已经了解并知道如何运用槽位{}+format()形式格式化输出。


#如何制作进度条1
h = "执行开始"
print("{:-^50}".format(h))#赋予“执行开始”所在行50个字符空间
salce = 10#每完成百分之十就输出一次进度条,改变此数值可以改变总输出条数
for i in range(salce+1):#i取值[0,salce]
    a,b = '**'*(i),'..'*(salce-i)#改变'*'或者'.'可以改变进度条长度
    c = (i/salce)*100#显示百分比
    print("{:^3.0f}% [{}-〉{}]".format(c,a,b))#为了输出整齐,利用{:^3.0f}格式化百分比部分,并居中
e = "执行结束"
print("{:-^50}".format(e))#赋予“执行结束”所在行50个字符空间

#output:
-----------------------执行开始-----------------------
 0 % [-〉....................]
10 % [**-〉..................]
20 % [****-〉................]
30 % [******-〉..............]
40 % [********-〉............]
50 % [**********-〉..........]
60 % [************-〉........]
70 % [**************-〉......]
80 % [****************-〉....]
90 % [******************-〉..]
100% [********************-〉]
-----------------------执行结束-----------------------
[Finished in 0.1s]


好,一次简单的文本条输出我们就搞定了!

但是,我们看向这完成时间:0.1s,这完成速度是在太快了,我眼睛都还没眨一下就输出了,针对于此,利用time库可模拟软件任务处理的时间效果。

使用import保留字调用Python标准库time,利用time.sleep(t)函数将当前程序暂时挂起t秒,t可以是小数。


#如何制作进度条2
import time
h = "执行开始"
print("{:-^50}".format(h))#赋予“执行开始”所在行50个字符空间
salce = 10#每完成百分之十就输出一次进度条
for i in range(salce+1):#i取值[0,salce]
    a,b = '**'*(i),'..'*(salce-i)
    c = (i/salce)*100
    print("{:^3.0f}% [{}-〉{}]".format(c,a,b))#为了输出整齐,利用{:^3.0f}格式化百分比部分,并居中
    time.sleep(0.1)#每次输出花费0.1秒,所以12次一共1.2秒
e = "执行结束"
print("{:-^50}".format(e))#赋予“执行结束”所在行50个字符空间

#output:
-----------------------执行开始-----------------------
 0 % [-〉....................]
10 % [**-〉..................]
20 % [****-〉................]
30 % [******-〉..............]
40 % [********-〉............]
50 % [**********-〉..........]
60 % [************-〉........]
70 % [**************-〉......]
80 % [****************-〉....]
90 % [******************-〉..]
100% [********************-〉]
-----------------------执行结束-----------------------
[Finished in 1.2s]


每次输出挂起时间之后,可以看到明显完成完成时间大幅度增加,花了1.2秒,聪明的人类也可以用肉眼观察到此进度条的逐条输出过程。

其实,可以利用time.perf_counter()函数在进度条里显示所花费的时间。

time库的perf_counter()函数函数一般多次出现,第一次调用时计时开始,同一程序中第二次及后续调用时返回在第一次开始计时基础上的后续时间,单位为秒。
该函数主要用来统计程序运行时间,增加用户体验。


#如何制作进度条3
import time
h = "执行开始"
print("{:-^50}".format(h))#赋予“执行开始”所在行50个字符空间
salce = 10#每完成百分之十就输出一次进度条
t = time.perf_counter()
for i in range(salce+1):#i取值[0,salce]
    a,b = '**'*(i),'..'*(salce-i)
    c = (i/salce)*100
    print("{:^3.0f}%[{}-〉{}] {:.2F}s".format(c,a,b,time.perf_counter()-t))#为了输出整齐,利用{:^3.0f}格式化百分比部分,并居中
    time.sleep(0.1)#每次输出花费0.1秒,所以12次一共1.2秒
e = "执行结束"
print("{:-^50}".format(e))#赋予“执行结束”所在行50个字符空间

#output:
-----------------------执行开始-----------------------
 0 %[-〉....................] 0.00s
10 %[**-〉..................] 0.10s
20 %[****-〉................] 0.20s
30 %[******-〉..............] 0.30s
40 %[********-〉............] 0.40s
50 %[**********-〉..........] 0.50s
60 %[************-〉........] 0.60s
70 %[**************-〉......] 0.70s
80 %[****************-〉....] 0.80s
90 %[******************-〉..] 0.90s
100%[********************-〉] 1.00s
-----------------------执行结束-----------------------
[Finished in 1.2s]


不过,以上都是输出都是逐行显示,要占据大量空间,那如何才能做到在同一行刷新输出,形成单行动态刷新效果呢?

使用转义符“r”可以帮到我们,并设置print()函数的end=''。

转义符“r”把输出指针移动到行首而不换行。


#如何制作进度条4
import time
h = "执行开始"
print("{:-^50}".format(h))#赋予“执行开始”所在行50个字符空间
salce = 10#每完成百分之十就输出一次进度条
t = time.perf_counter()
for i in range(salce+1):#i取值[0,salce]
    a,b = '**'*(i),'..'*(salce-i)
    c = (i/salce)*100
    print("r{:^3.0f}%[{}-〉{}] {:.2F}s".format(c,a,b,time.perf_counter()-t),end='')#为了输出整齐,利用{:^3.0f}格式化百分比部分,并居中
    time.sleep(0.1)#每次输出花费0.1秒,所以12次一共1.2秒
e = "执行结束"
print("n{:-^50}".format(e))#赋予“执行结束”所在行50个字符空间


但其实,程序运行之后还是和没有改变一样,并没有形成单行动态刷新的效果,这是为何?

因为Python的IDLE本身屏蔽了单行刷新功能,其他解析器同理,为了获得单行刷新效果,可以使用控制台执行本程序,本程序命名testprogressbar.py。

启动控制台:Windows+R,输入CMD,回车后即进入页面。
改变控制台默认路径以此来执行python程序,输入:
cd /d D:Program FilesPythonPython_FilesTemporary_Test,按回车
之后在新路径下输入python程序文件名,回车即可


python copy 进度条 python添加进度条_取值_02


只是我电脑的控制台页面小字体小。还不能显示中文,只好截个图看看了,不能此方法确实可以成功。

其实酱紫用户体验度还不够,要是我想输出在前期进展较为缓慢,而在后期进展较为快速的进度条呢?

进度条迭代速度呈非线性关系,任务进程就如y=x^2在区间[0,1]的图像。

研究人员研究表明:
用户可以忍受最初的慢速增长;
用户难以忍受在进程快要结束时进度条突然停滞不前。

据此,设计进度条时可以适当降低开始阶段的进展速度,然后适当加快末尾阶段的进展速度,酱紫的调整可以给用户带来更舒适、“更快”的体验。

上代码!


#如何制作进度条5
import time
salce = 10#每完成百分之十就输出一次进度条
print("执行开始".center(100,'-'))#str.center(width,fillchar)字符居中函数
t = time.perf_counter()
for i in range(salce+1):#i取值[0,salce]
    a,b = '*'*int((i+(1-i)*0.03)**2),'.'*abs(94-int((i+(1-i)*0.03)**2))#此处利用函数y=(x+(1-x)*0.03)^2,此做法难以确定整个进度条占用空间
    c = (i/salce)*100
    print("r{:^3.0f}%[{}-〉{}] {:.2F}s".format(c,a,b,time.perf_counter()-t),end='')#为了输出整齐,利用{:^3.0f}格式化百分比部分,并居中
    time.sleep(0.1)#每次输出花费0.1秒,所以12次一共1.2秒
e = "执行结束"
print("n"+"执行结束".center(100,'-'))#赋予所在行100个字符空间,比94大,此处不够智能


#output:
------------------------------------------------执行开始------------------------------------------------

 0 %[-〉..............................................................................................] 0.00s
10 %[*-〉.............................................................................................] 0.10s
20 %[***-〉...........................................................................................] 0.20s
30 %[********-〉......................................................................................] 0.30s
40 %[***************-〉...............................................................................] 0.40s
50 %[***********************-〉.......................................................................] 0.50s
60 %[**********************************-〉............................................................] 0.60s
70 %[**********************************************-〉................................................] 0.70s
80 %[************************************************************-〉..................................] 0.80s
90 %[****************************************************************************-〉..................] 0.90s
100%[**********************************************************************************************-〉] 1.00s
------------------------------------------------执行结束------------------------------------------------
[Finished in 1.2s]


可以看到进度条的“**”不再呈直线增多,而是呈曲线形状,前期增加慢,后期较快。唯一不足的是进度条所占长度无法确定,需手工调整,显得不够“智能”。