一日一技:命令行进度条是什么原理?

简介: 一日一技:命令行进度条是什么原理?

今年4月份,我写了一篇文章:字符串离奇消失之谜,有同学在评论里面问我:


4.png


\r有什么用?我们今天就来看看,如何使用\r来实现一个简易的命令行进度条。运行效果如下面这个动图所示:


5.gif


这个SimpleProcessBar是怎么实现的呢?其实它的代码非常简单:


import time
class SimpleProcessBar:
    def __init__(self, total, finished='■', unfinished='□'):
        self.total = total
        self.finished = 0
        self.unfinished_char = unfinished
        self.finished_char = finished
        self.bar = [self.unfinished_char] * 100
    def incr(self, value=1):
        self.finished += value
        if self.finished > 100:
            self.finished = 100
        bar = self.generate_bar()
        print(bar, end='\r')
    def generate_bar(self):
        finished = int(self.finished / self.total * 100)
        self.bar[:finished] = self.finished_char * finished
        return ''.join(self.bar) + f' {finished} %'
x = SimpleProcessBar(30)
for i in range(30):
    x.incr()
    time.sleep(1)


真正的核心代码就只有一行:print(bar, end='\r')。其它代码都是辅助这一行的。我们试一试直接手动执行一下:


import time
print("□" * 10, end='\r')
time.sleep(1)
print(f'{"■" * 3}{"□" * 7}', end='\r')
time.sleep(1)
print(f'{"■" * 6}{"□" * 4}', end='\r')
time.sleep(1)
print(f'{"■" * 9}{"□" * 1}', end='\r')
time.sleep(1)
print("■" * 10, end='\r')


运行效果如下所示:


6.gif


因此,假设我们要画100个方块,那么,根据不同的进度,计算黑色实心方块的数量和白色空心方块的数量,然后把进度条的长字符串拼接起来,就可以打印了。


在默认情况下。print()函数会默认给每个字符串末尾增加一个\n换行符,所以我们每次使用print()都会自动换行,如下图所示:


7.png


这个末尾添加的字符,是通过end参数传入的。我们试一试更换成其它符号:


8.png


而根据本文开始引用的这篇文章的解释,\r会让输出光标回到行首,所以又会重新打印进度条,于是就形成了进度条更新的效果。


请关注微信公众号【未闻Code】获取更多精彩文章。


目录
相关文章
|
6月前
|
算法 定位技术 C语言
【python实操】软件安装进展提示进度条如何实现的?如何设置窗体拉伸?如何获取输入框内容?
【python实操】软件安装进展提示进度条如何实现的?如何设置窗体拉伸?如何获取输入框内容?
94 0
Pycharm主题切换(禁用)导致UI界面显示异常解决
问题记录 UI显示异常 安装多个主题时,当禁用某些主题,切换回one dark theme时,发现代码编辑窗口背景变成白色,菜单栏其他地方背景为黑色 问题原因 查看Settings>Editor>Color Scheme>General,发现方案被改为-Classic Light
|
6月前
|
存储 前端开发 安全
python窗口刷新图片
【4月更文挑战第11天】
|
数据可视化
PyQt5-如何设置主窗口居中?退出应用程序如何操作?
PyQt5-如何设置主窗口居中?退出应用程序如何操作?
94 0
排错实战——你知道拖动窗口时只显示虚框怎么设置吗?
你知道拖动窗口时只显示虚框怎么设置吗?
Magisk模块:阴影截图可切换带壳截图
一款自动为截图套上阴影边框的面具模块 使用模块自动完成截图后的套阴影操作 如果不想使用阴影方式,也可以切换为带壳,壳子可以自定义 还有更多3D壳子可供选择
279 0
运行主程序后无法显示图形化界面的原因及其解决方法(拼图小游戏)
在定义完GameJFrame、LoginJFrame和RegisterJFrame方法后,如果要调用该方法内的成员变量,要使用this关键字,而不是像在测试类中新建对象后直接调用新的对象,这样的话由于我们调用的方法是不含参数的,如果new了一个对象会被放到堆内存中,数据也在堆内存中,所以无法访问到
236 0
运行主程序后无法显示图形化界面的原因及其解决方法(拼图小游戏)
|
前端开发 C语言 C++
Python Tkinter Gui 窗口图标,标签,输入,单复选,文件导入,按钮,日志 等常用组件 基本使用
tkinter是什么? 我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口; Tk是一个图形库,支持多个操作系统,使用Tcl语言开发; Tk会调用操作系统提供的本地GUI接口,完成最终的GUI;
1255 0
Python Tkinter Gui 窗口图标,标签,输入,单复选,文件导入,按钮,日志 等常用组件 基本使用
|
数据可视化 Linux Python
教你用Python脚本使用进度条
教你用Python脚本使用进度条
220 0
Appium问题解决方案(1)- 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘
Appium问题解决方案(1)- 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘
417 0
Appium问题解决方案(1)- 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘