0

我编写了以下代码(在代码审查中进行了审查)以便在 python 2.7 中打印进度条(PS:我知道 Python 中有一个进度条模块

from __future__ import division
import sys

class Progress(object):
    def __init__(self, maxval):
        self._pct = 0
        self.maxval = maxval

    def update(self, value):
        pct = int((value / self.maxval) * 100.0)
        if self._pct != pct:
            self._pct = pct
            self.display()

    def start(self):
        self.update(0)

    def finish(self):
        self.update(self.maxval)

    def display(self):
        sys.stdout.write("|%-100s| %d%%" % ('#' *self._pct, self._pct) + '\n')
        sys.stdout.flush()

# test
import time

toolbar_width = 300
pbar = Progress(toolbar_width)
pbar.start()
for i in xrange(toolbar_width):
    time.sleep(0.1) # do real work here
    pbar.update(i)
pbar.finish()

我希望在我的 IDE(例如:Pyscripet、PyCharm 等)和命令提示符中使用这个进度条。当我使用命令提示符运行时,我遇到以下两个问题,我无法理解如何解决。

在此处输入图像描述

  1. 首先,进度条打印出限制(我用了 100s)
  2. 其次,进度条一个接一个地打印所有条。我希望只有一个在循环期间增加的栏
4

3 回答 3

2

问题1:

您的终端窗口宽度小于 100 个字符,这就是为什么您的进度条似乎打印超出限制,而它只是将输出包装为 80 个字符(这是 Windows 上的标准和控制台宽度)。

为避免包装,请尝试:

sys.stdout.write("|%-50s| %d%%" % ('#' *int(self._pct/2), self._pct) + '\n')
于 2013-03-18T12:58:39.303 回答
1

问题 2:如果要在一行中显示递增的进度控制台栏,则必须重置光标位置,可以通过stdout.

import sys, time

for x in range(10):
    sys.stdout.write((x+1) * '#')
    time.sleep(1)
    sys.stdout.write("\r") # !!! carriage return sign under Windows !!!

print("Fine")

但我很遗憾地说:大多数情况下这在 IDE 标准输出封装环境中不起作用

Eclipse、PyCharm 等正在读取标准输出管道并将更改原始打印到控制台视图中。

于 2013-03-18T13:03:24.593 回答
1

1.可能是由于行长而换行,终端看起来窄于 100 个字符宽。如果您想假设 80 个字符(大多数控制台默认为),我认为您还有 7 个字符的其他内容,因此进度条使用 73 个字符的宽度。

    sys.stdout.write("|%-73s| %3d%%" % ('#' * int(self._pct*.73), self._pct) + '\n')

2.要保持在同一行,请使用sys.stdout.write并且不要在末尾包含换行符。然后在\r每行的开头添加一个以返回开头。

        sys.stdout.write("\r|%-73s| %3d%%" % ('#' * int(self._pct*.73), self._pct))

您还可以使用%3d%%填充百分比,使其始终保持右对齐。

于 2013-03-18T13:06:03.993 回答