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()计时
- 计时
-
计时方法适合各类需要统计时间的计算问题 例如:比较不同算法时间,统计部分程序运行时间
- 进度条
-
在任何运行时间较长的程序中增加进度条 在任何希望提高用户体验的应用中增加进度条 进度条是人机交互的纽带之一
版本四: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