2022(秋)实验二:动态进度条

计212汤佳丽 学生 2022-11-20 17:06:34

1、实验目的

  • 了解动态进度条的原理;
  • 掌握如何编写完整的模块。

2、实验内容

本实验将使用Python3 实现命令行中的动态进度条,并且能被其它程序调用,为程序执行任务的进度提供直观的展示。

3、实验知识点

  • 进度条原理;
  • 输出缓冲区;
  • 类。

4、实验时长

    8学时。

5、实验环境

    该实验在内置Python中完成。

6、实验过程

本节将通过实践操作,带领大家使用Python3 实现命令行动态进度条。建议先把程序运行一下看一下效果,再来理解相关代码。

  1. 原理探究;
  2. 模块编写;
  3. 实验总结。

6.1 原理探究

我们都知道电影的原理,连续的画面是由一帧帧单独的图片构成的。动态进度条同理,即在同一行内连续播放不同的图案。要想在同一行内连续播放不同的图案,就必须知道如何在同一行内输出时覆盖掉之前存在的字符。下面我们一起来探究这个问题。代码执行结果是动态的,请注意观察。

我们首先来使用 print() 函数来多次输出不同的字符串看看:

新建example1.py文件。代码如下:

运行 example1.py:

0000000000

1111111111

2222222222

3333333333

4444444444

输出了很多行。但我们要在一行内输出,使用 print() 函数的关键字参数 end 把行末的换行符替换为空字符。

新建example2.py文件。代码如下:

运行 example2.py:

00000000001111111111222222222233333333334444444444

这下输出到了一行。但我们很明显的发现,5个字符串是一次性同时输出的。并且每次输出时并未覆盖当前行,而是在行末接着输出。

因为 python 中的标准输入输出默认是使用行缓冲的。而对于行缓冲来说,缓冲区读取到换行符 \n 或回车符 \r 时刷新缓冲区。

我们可以使用 sys.stdout.flush() 函数在每次迭代时刷新缓冲区。

新建example3.py文件。代码如下:

运行 example3.py:

00000000001111111111222222222233333333334444444444

现在就不是一次性同时输出了。现在我们解决接着当前行末尾输出的问题。我们只需要使用一个字符:回车符 \r。回车符的作用是回到行首,这时我们再输出字符将会覆盖同一行内已存在的字符。

新建example4.py文件。代码如下:

运行 example4.py:

4444444444

最后我们再改进一下,我们直接使用 sys.stdout.write() 代替 print(),并且对输出的字符做了一点变化。

新建example5.py文件。代码如下:

运行 example5.py:

9876543210

这个程序说明了一个问题,覆盖输出的时候只会覆盖掉相同长度的字符。

6.2 模块编写

 

新建progressbar.py。编写一个类,叫ShowProcess。接下来定义一个全局变量:进度条的长度。

定义50个字符的长度,用max_arrow表示。还要记录进度条当前是第几个,用i表示。 

max_steps表示一共有多少个任务。bar_char表示进度条用什么符号表示。

info_done表示进度条到了100%后,输出什么信息。

本实验完整代码如下:

 

6.3 实验总结

本实验了解了命令行动态进度条的原理,并自己编写了一个完整的模块,加深了对输出缓冲区、可变参数列表、面向对象编程的理解。

...全文
112 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
Python程序设计基础

2290

社区成员

软件工程老师
python 高校 江苏省·南通市
社区管理员
  • juking@ntu
加入社区
帖子事件
创建了帖子
2022-11-20 17:06
社区公告
暂无公告