国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現控制臺中的進度條功能代碼

2020-02-16 11:16:06
字體:
來源:轉載
供稿:網友

進度條最主要的問題就是所有字符全部在同一行,而且可以修改。

然而當執行print語句的時候,python會在打印完這個語句的同時在結尾加上‘/n',也就是換行,這就導致在控制臺下一旦被print之后就無法再修改了。所以我們現在的輸出就不能再使用print來完成了。

我們要使用的是來自sys庫的sys.stdout.write()函數,這個函數會在控制臺輸出這個字符串的同時不加上任何結尾,這就意味著這個輸出還沒有完全結束。通過sys.stdout.flush()函數可以把輸出暫時打印在控制臺中(造成print的假象,我們姑且先叫這個假輸出)。那么如果我們使用‘r'這個轉義字符(回到行首),一切看起來是不是就合理很多了呢?

也就是說:打印字符串的時候,沒有加上'/n',同時讓光標回到行首,再把當前緩沖區顯示出來,也就好象是print了一樣,但是這時候光標還在原來的位置。

一個例子

[經測試,在Linux終端中執行才有效果,pycharm中調試輸出沒有效果]

import sys, timefor i in range(5): sys.stdout.write('HELLO: %05d' % i) sys.stdout.flush() time.sleep(1)

在終端下執行這段代碼就會得到簡單的進度條效果。

接下來還需要解決兩個問題:

一:清空緩沖區

有些聰明的讀者可能發現,當新的字符串比之前短的時候會出現問題,比如下面這段代碼:

import sys, timefor i in range(5): sys.stdout.write(str(i) * (5 - i) + '/r') sys.stdout.flush() time.sleep(1)

運行后發現結果跟我們希望的不太一樣。

其實是因為已經被flush出去的字符并不會主動清空,所以只有新寫入的被修改了。針對這點我目前的解決方案是先輸出一波空格把之前的字符串沖掉然后重新寫:

import sys, timefor i in range(5):sys.stdout.write(' ' * 10 + '/r')sys.stdout.flush()sys.stdout.write(str(i) * (5 - i) + '/r')sys.stdout.flush()time.sleep(1)

二:固定底邊輸出

有時候我們希望在進度條加載的同時還有一些其他的輸出。

我們不妨在刷新掉上一次輸出之后輸出所需輸出的字符串,然后在假輸出進度條。

采用如下代碼:

import sys, timefor i in range(5): sys.stdout.write(' ' * 10 + '/r') sys.stdout.flush() print i sys.stdout.write(str(i) * (5 - i) + '/r') sys.stdout.flush() time.sleep(1)

就可以完成所需任務了。

怎么樣,其實原理還是挺簡單的吧?

這里給出一個自己實現的類用來打印進度條:

import sys, timeclass ProgressBar: def __init__(self, count = 0, total = 0, width = 50):  self.count = count  self.total = total  self.width = width def move(self):  self.count += 1 def log(self, s):  sys.stdout.write(' ' * (self.width + 9) + '/r')  sys.stdout.flush()  print s  progress = self.width * self.count / self.total  sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total))  sys.stdout.write('#' * progress + '-' * (self.width - progress) + '/r')  if progress == self.width:   sys.stdout.write('/n')  sys.stdout.flush()bar = ProgressBar(total = 10)for i in range(10): bar.move() bar.log('We have arrived at: ' + str(i + 1)) time.sleep(1)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 繁峙县| 双桥区| 山西省| 内黄县| 郧西县| 高唐县| 綦江县| 新蔡县| 三河市| 册亨县| 隆安县| 墨竹工卡县| 盐源县| 阿图什市| 韶山市| 德钦县| 大余县| 德格县| 开封市| 玉树县| 黑龙江省| 巴南区| 广灵县| 石首市| 绥中县| 阿拉善盟| 临清市| 保德县| 民权县| 香河县| 溆浦县| 贺州市| 和硕县| 闻喜县| 稻城县| 札达县| 石狮市| 合肥市| 宜宾市| 哈尔滨市| 澄江县|