[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, '-'))

运行结果如下:

在这里插入图片描述
这次的分享就到这里啦,继续加油哦^^

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

  • 56
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
### 回答1: 1. 忘记更新进度条进度条需要在每一次循环迭代后更新,如果忘记更新,进度条将会停止在某一个位置,无法正确反映进度。 2. 进度条过长或过短:进度条需要正确反映任务的进度,如果进度条过长或过短,将无法正确反映任务的进度。 3. 进度条样式不美观:进度条作为用户界面的一部分,需要具备美观性,如果样式不美观,将影响用户体验。 4. 进度条速度过快或过慢:进度条需要根据任务的复杂程度和计算速度来设置速度,如果速度过快或过慢,将影响用户体验。 5. 进度条无法中止:有时候,用户需要中止任务,如果进度条无法中止,将会给用户带来困扰。 6. 进度条无法重新开始:有时候,用户需要重新开始任务,如果进度条无法重新开始,将会给用户带来困扰。 ### 回答2: Python实现文本进度条时,常见的错误有以下几点: 1. 字符串拼接错误:在更新进度条时,使用字符串拼接来更新显示进度的字符串。这种方法会频繁创建新的字符串对象,导致大量的内存开销和性能下降。解决方法是使用字符串格式化或者列表拼接的方式来更新进度条字符串。 2. 进度计算错误:在计算进度条所占比例时,往往会出现计算错误的情况。例如,没有正确计算出当前任务的进度百分比,导致进度条显示不准确。解决方法是要确保通过正确的方式计算出当前任务的进度比例。 3. 更新频率错误:一些初学者在实现文本进度条时,频繁地更新进度条,这会导致屏幕输出过于频繁,给用户的体验造成困扰。解决方法是适度地控制更新的频率,可以使用时间间隔的方式来更新进度条。 4. 转义字符错误:在更新进度条时,在控制台输出时往往使用了转义字符来控制光标的位置。但是有些初学者容易出现转义字符使用错误的情况,导致输出的进度条格式混乱。解决方法是在使用转义字符时要仔细检查是否使用正确。 5. 异步更新错误:在多线程或异步编程中,如果没有正确处理更新进度条的同步问题,会导致多个线程同时更新进度条,造成进度条显示错乱。解决方法是使用线程锁或者其他同步机制来保证进度条的正确显示。 综上所述,Python实现文本进度条时需要注意以上几个常见的错误,以保证进度条的正确显示和良好的用户体验。 ### 回答3: Python实现文本进度条时,常见的错误包括以下几个方面: 1. 输出覆盖:在进度条更新时,如果直接使用print语句输出更新信息,会导致进度条上一行的内容被新的进度条信息覆盖。为了解决这个问题,可以使用'\r'特殊字符回车到行首,再输出新的进度条信息。 2. 进度计算错误:进度条的进度计算错误可能会导致进度条的显示不准确。例如,如果设定的总任务数与实际执行任务数不符,或者进度计算公式有误,导致进度条的百分比不准确。在编写代码时,需要确保进度计算的准确性。 3. 进度更新不及时:在某些情况下,进度条的更新可能不及时,导致用户无法即时看到进度变化。这可能是由于代码逻辑问题导致的,例如,程序在更新进度条之前耗时很长,或者进度更新频率过低。要解决这个问题,可以适当调整更新进度条的位置和频率。 4. 进度条长度超出终端宽度:当进度条的长度超过终端宽度时,可能会导致进度条显示不完全或错位。为了解决这个问题,可以通过获取终端宽度的方法来动态调整进度条的长度,以保证正确显示。 5. 多线程并行问题:当使用多线程或并行处理时,可能会导致进度条的更新出现错乱或混乱。这是因为多个线程同时更新进度条时,输出会相互干扰。为了解决这个问题,可以使用线程锁或其他同步机制,确保进度条的更新是有序的,避免线程间的竞争。 在实现文本进度条时,需要注意以上错误,并根据具体情况采取相应的解决方案,从而实现一个稳定、准确、美观的文本进度条

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序喵正在路上

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值