[Python] 实现文本进度条

目录

  • 简单的开始
  • 单行动态刷新
  • 带刷新的文本进度条
  • 简单的开始

    进度条是计算机处理任务或执行软件中常用的增强用户体验的重要手段,它能度条功能。今天我们将利用 Python 字符串处理方法实现文本进度条功能。

    最简单地,利用 print() 函数实现简单的非刷新文本进度条。基本思想是按照任务执行百分比将整个任务划分为 100 个单位,每执行 N% 输出一次进度条。 每一行输出包含进度百分比,代表已完成的部分(**) 和未完成的部分(…)的两种字符,以及一个跟随完成度前进的小箭头,风格如下:

    %10 [***** -> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .]

    由于程序执行速度远超过人眼的视觉停留时间,直接进行字符输出几乎是瞬间完成,不利于观察。为了模拟任务处理的时间效果,调用 Python 标准时间库 time,使用 **time sleep()**函数将当前程序暂时挂起 t s, t 可以是小数。由此可以接近真实的模拟进度条效果输出。使用 import 保留字调用 time 库。

    import time
    

    默认情况,print() 函数在输出结尾处会自动产生一个 ‘\n’, 即换行符,从而让光标自动移动到下一行行首,这样上一步输出依旧保存在界面上。

    采用 for 循环和 print() 函数构成程序的主体部分,输出百分比最高(100%)为 3 位数据,为了使输出显得整齐,可以使用 {:^3.0f} 格式化百分比部分。这个简单的文本进度条代码如下。变量 scale 表示输出进度条的精度,我们可以修改这个值观察效果变化。

    import time
    scale = 10
    print("------执行开始------")
    for i in range(scale+1):
        a = '**' * i
        b = ' . . ' * (scale - 1)
        c = (i / scale) * 100
        print("%{:^3.0f}[{} -> {}]".format(c,a,b))
        time.sleep(0.1)
    print("------执行结束------")
    

    运行结果如下:

    ——执行开始——
    % 0 [ -> . . . . . . . . . . . . . . . . . . ]
    %10 [** -> . . . . . . . . . . . . . . . . . . ]
    %20 [**** -> . . . . . . . . . . . . . . . . . . ]
    %30 [****** -> . . . . . . . . . . . . . . . . . . ]
    %40 [******** -> . . . . . . . . . . . . . . . . . . ]
    %50 [********** -> . . . . . . . . . . . . . . . . . . ]
    %60 [************ -> . . . . . . . . . . . . . . . . . . ]
    %70 [************** -> . . . . . . . . . . . . . . . . . . ]
    %80 [**************** -> . . . . . . . . . . . . . . . . . . ]
    %90 [****************** -> . . . . . . . . . . . . . . . . . . ]
    %100[******************** -> . . . . . . . . . . . . . . . . . . ]
    ——执行结束——

    单行动态刷新

    常用的计算机系统中都有进度条,这些进度条般只在一行中改变进度比例,与前面的代码相比,区别在于原地输出和动态刷新,其基本思想是将每次进度输出都固定在同一行,并不断地用新生成的字符串覆盖之前的输出,形成进度条不断刷新的动态效果。这种效果称为“单行动态刷新”,可以通过 print() 函数实现。

    采用 print() 函数的具体方法是,在 print() 函数中更换参数 end 的默认值为’ ',即每次使用 print() 函数输出时不换行。此时,系统输出指针还停留在上一次输出的行尾,下一次输出在字符串前部增加转义符 ‘\r’,该转义符把输出指针移动到行首而不换行。动态刷新一个百分比的完整代码如下:

    import time
    for i in range(101):
        print("\r{:3}%".format(i),end=' ')
        time.sleep(0.05)
    
    

    运行结果如下:

    带刷新的文本进度条

    将前两小节的程序合并,再添加开始和结束提示语,可以很好地实现带刷新的文本进度条。为了进一步提高用户体验,在文本进度条中增加运行时间的监控,这里采用 time 库中的 time.perf_counter() 函数。time.perf_counter() 函数一 般多次出现, 第一次调用时计时开始,同一程序中第二次及后续调用时返回与第一次计时之间的时间差, 单位为微秒。该函数主要用来统计程序运行时间,增加用户体验。文本进度条完整代冯如下:

    import time
    
    scale = 50
    print("执行开始".center(scale // 2, '-'))
    t = time.perf_counter()                     # 单位为微秒
    for i in range(scale + 1):
        a = '*' * i
        b = '.' * (scale - i)
        c = (i / scale) * 100
        t -= time.perf_counter()
        print("\r{:^3.0f}% [{} -> {}] {:.2f}s".format(c, a, b, -t/1000000), end=' ')
        time.sleep(0.05)
    print("\n" + "执行结束".center(scale // 2, '-'))
    

    运行结果如下:


    这次的分享就到这里啦,继续加油哦^^

    有出错的地方欢迎在评论区指出来,共同进步,谢谢

    物联沃分享整理
    物联沃-IOTWORD物联网 » [Python] 实现文本进度条

    发表评论