快捷搜索: 王者荣耀 脱发

Python项目实践:文本进度条

文本进度条

采用字符串方式打印可以动态变化的文本进度条

    进度条需要能在一行中逐渐变化 采用sleep()函数模拟一个持续的进度

版本一:简单的开始

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

版本二:单行动态刷新

刷新的本质:用后打印的字符覆盖之前的字符

    每次输出之后不能换行:print()需要被控制,end参数 每次输出之后要能回退: 光标返回到本行行首
# TextProBarV2.py
import time
for i in range(101):
    print("
{:3}%".format(i), end="")
    time.sleep(0.1)
    Print(),默认输出后在后面增加一个换行。end作用:print输出完成后后面增加的信息。如果希望输出后增加一个其他东西,则end=”其他东西”,如果end=””,则输出完成后不换行,光标停在那当次输出字符串的后面 ,在打印字符串之前将光标移动到本行行首 IDE不是运行程序的环境,是开发程序的环境,为保证开发环境效果,系统将 屏蔽掉了。为保证运行效果,可打开Windows命令行工具:Windows键+R输入“cmd”输入文件地址和文件名回车 即可看到单行动态刷新的进度。或者在Pycharm或VS Code即可看到。

版本三:完整效果

# TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale // 2, "-"))
start = time.perf_counter()
for i in range(scale + 1):
    a = "*" * i
    b = "-" * (scale - i)
    c = (i / scale) * 100
    dur = time.perf_counter() - start
    print("
{:3.0f}%[{}->{}]{:.2f}s".format(c, a, b, c), end="")
    time.sleep(0.1)
print("
" + "执行结束".center(scale // 2, "-"))

四、举一反三

文本进度条程序使用了time.perf_counter()计时

  1. 计时
    计时方法适合各类需要统计时间的计算问题 例如:比较不同算法时间,统计部分程序运行时间
  1. 进度条
    在任何运行时间较长的程序中增加进度条 在任何希望提高用户体验的应用中增加进度条 进度条是人机交互的纽带之一

版本四:early pause:speeds up

# TextProBarV4.py
import time
from math import sin

scale = 50
print("执行开始".center(scale // 2, "-"))
start = time.perf_counter()

for i in range(scale + 1):
    x = i + (1 - sin(i * 3.14 * 2 + 3.14 / 2)) / -8
    a = "*" * int(x)
    b = "-" * (scale - int(x))
    c = (i / scale) * 100
    dur = time.perf_counter() - start
    # print("
{:3.0f}%[{}->{}]耗时{:.2f}s".format(c, a, b, c), end="")
    print("
{:3.0f}%[{}->{}]".format(c, a, b), end="")
    time.sleep(0.1)
print("
" + "执行结束".center(scale // 2, "-"))

Power:speeds up

# TextProBarV4.py
import time

scale = 10
print("执行开始".center(scale // 2, "-"))
start = time.perf_counter()

for i in range(scale + 1):
    x = (i + (1 - i) * 0.03) ** 2
    a = "*" * int(x)
    b = "-" * (scale - int(x))
    c = (i / scale) * 100
    dur = time.perf_counter() - start
    # print("
{:3.0f}%[{}->{}]耗时{:.2f}s".format(c, a, b, dur), end="")
    print("
{:3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end="")
    time.sleep(0.4)
print("
" + "执行结束".center(scale // 2, "-"))

版本五:progressbar

# ProgressBarV5.py
progressBefore = 0


def printProgressBar(percent, prefix = ):
    global progressBefore
    if percent - progressBefore < 0.001:  # 只有当进度达到千分之一才刷新,避免频繁刷新进度条
        return
    progressBefore = percent
    percentStr = "{0:.1f}".format(percent*100) 
    filledLength = int(30 * percent)
    bar = █ * filledLength + - * (30 - filledLength)
    print(
%s |%s| %s%%  % (prefix, bar, percentStr), end=)


if __name__ == "__main__":   
    import time
    for i in range(1000):
        printProgressBar((i+1)/1000, prefix="Progress:")
        time.sleep(0.01)		# 当前进程暂停0.01s

PS:参阅python123.io

经验分享 程序员 微信小程序 职场和发展