python控制台等待输出倒计时、转圈、进度条

python控制台等待输出倒计时、转圈、进度条

1. 控制台输出倒计时

#!/usr/bin/python3
# -*- coding:utf-8 -*-

"""
python控制台倒计时
"""
__author__ = "river.yang"
__date__ = "2022/11/26 20:20"
__version__ = "1.0.0"

from time import sleep
from datetime import datetime, timedelta
import time


def count_down(weeks=0, days=0, hours=0, minutes=0, seconds=0):
    remain_time = timedelta(weeks=weeks, days=days, hours=hours, minutes=minutes, seconds=seconds)
    while remain_time.total_seconds() > 0:
        time.sleep(1)
        remain_time -= timedelta(seconds=1)
        print("\r 倒计时:{}".format(remain_time), end="", flush=True)


def print_test():
    for i in range(20):
        print("#", end="", flush=True)
        sleep(0.1)


if __name__ == '__main__':
    print("当前版本: ", __version__)
    count_down(seconds=11)

代码解析:

这里主要用到了print函数的几个参数,解释如下:

参数1:end,设置字符串末尾的字符,默认是"/n"换行符,这里赋值"",也就是什么也不加,就不会自动换行

参数2:flush,设置是否清除显示,默认是False,赋值True避免出现重影等显示问题

另外,这里在输出倒计时前,加了"/r"字符,意思是将光标定位到行首进行输出显示
输出效果如下:
python控制台等待输出倒计时、转圈、进度条_第1张图片

2. 控制台输出转圈

def circle_print(total_time=0):
    list_circle = ["\\", "|", "/", "—"]
    for i in range(total_time * 4):
        time.sleep(0.25)
        print("\r{}".format(list_circle[i % 4]), end="", flush=True)

输出效果如下:

python控制台等待输出倒计时、转圈、进度条_第2张图片

3. 控制台输出进度条

(1)简易进度条,没有进度指示,只有简单符号

def print_test():
    for i in range(20):
        print("#", end="", flush=True)
        sleep(0.1)

效果如下:

python控制台等待输出倒计时、转圈、进度条_第3张图片

(2)复杂进度条

这里需要依赖第三方库,使用指令安装:pip3 install tqdm

# -*- coding=utf-8 -*-

import time
from tqdm import tqdm

for i in tqdm(range(100)):
    time.sleep(0.1)

** 输出效果如下:**

python控制台等待输出倒计时、转圈、进度条_第4张图片

(3)复杂进度条

上面的进度条要依赖第三方库,不方便移植程序,用着着实不爽,所以干脆自己实现一个方便移植

#!/usr/bin/python3
# -*- coding:utf-8 -*-

"""
python控制台进度打印
"""
__author__ = "river.yang"
__date__ = "2022/11/26 20:20"
__version__ = "1.0.0"

import time

def del_progress():
    time.sleep(0.2)

def progress_print(total_cnt=20, index_cha='+', pro_total_cnt=50, fun=None):
	"""
    :param total_cnt: 总循环次数
    :param index_cha: 进度指示符号,可以任意替换喜欢的符号
    :param pro_total_cnt: 100%进度显示的总符号个数
    :param fun: 每次进度循环处理的回调函数
    """
    start_time = time.time()
    for i in range(total_cnt):
        current_cnt = int((i + 1) / total_cnt * pro_total_cnt)
        str_progress = index_cha * current_cnt + ' ' * (pro_total_cnt - current_cnt)
        spend_time = time.time() - start_time
        print("\033[31m\r{:.1%} [{}] total time: {:.2f}s\033[0m".format((i + 1) / total_cnt, str_progress, spend_time),
              end="", flush=True)
        if fun is not None:
            fun()

if __name__ == '__main__':
    print("当前版本: ", __version__)
    progress_print(fun=del_progress)

输出效果如下:

python控制台等待输出倒计时、转圈、进度条_第5张图片

代码解析

这里用到了几个知识点

  • print的几个参数:end,flush上面讲过了不再赘述
  • print显示颜色,语法格式为
\033[前景色m******\033[0m
# 这里****为打印显示的内容
\033[显示方式; 前景色; 背景色m******\033[0m

其中显示方式和颜色如下表

显示方式 显示效果
0 默认值
1 高亮(加粗)
4 下划线
5 闪烁
7 反显
8 不可见
前景色 背景色 颜色说明
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
  • format格式化字符串百分比显示和保留小数位数,详细用法见下表
数字 格式 输出 描述
3.1415926 {:.2f} 3.14 保留小数点后两位
3.1415926 {:+.2f} +3.14 带符号保留小数点后两位
-1 {:-.2f} -1.00 带符号保留小数点后两位
2.71828 {:.0f} 3 不带小数
5 {:0>2d} 05 数字补零 (填充左边, 宽度为2)
5 {:x<4d} 5xxx 数字补x (填充右边, 宽度为4)
10 {:x<4d} 10xx 数字补x (填充右边, 宽度为4)
1000000 {:,} 1,000,000 以逗号分隔的数字格式
0.25 {:.2%} 25.00% 百分比格式
1000000000 {:.2e} 1.00e+09 指数记法
13 {:>10d} 13 右对齐 (默认, 宽度为10)
13 {:<10d} 13 左对齐 (宽度为10)
13 {:^10d} 13 中间对齐 (宽度为10)
11 ‘{:b}’.format(11)
‘{:d}’.format(11)
‘{:\o}’.format(11)
‘{:x}’.format(11)
‘{:#x}’.format(11)
‘{:#X}’.format(11)
1011
11
13
b
0xb
0XB
进制

^, <, > 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
+ 表示在正数前显示 +,负数前显示 -; (空格)表示在正数前加空格
b、d、o、x 分别是二进制、十进制、八进制、十六进制。
此外我们可以使用大括号 {} 来转义大括号

  • 把处理函数time.sleep(0.2)单独作为参数传入,目的是为了方便扩展,以后同时做处理和进度显示,就可以把处理部分单独写成函数传入,逻辑更加清晰。

·
·
·

欢迎各位老铁一键三连,本号后续会不断更新树莓派、人工智能、STM32、ROS小车相关文章和知识。

大家对感兴趣的知识点可以在文章下面留言,我可以优先帮大家讲解哦

欢迎大家光临我的淘宝小店【玩转智能机器人】,会定期推出教程中使用的物美价优的硬件,你的光临就是对我的支持

原创不易,转载请说明出处。

你可能感兴趣的:(Python,python,开发语言)