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 (例: Pysripet、PyCharm など) とコマンド プロンプトで使用したいと考えています。コマンドプロンプトで実行すると、次の2つの問題があり、修正方法がわかりません。

ここに画像の説明を入力

  1. 最初に、プログレスバーに制限が出力されます(私は100秒を使用しました)
  2. 次に、プログレスバーはすべてのバーを次々に印刷します。ループ中に増加するバーを 1 つだけにしたい
4

3 に答える 3

2

問題1:

ターミナルウィンドウの幅は100文字未満です。そのため、プログレスバーは制限を超えて印刷されているように見えますが、出力は80文字(ウィンドウの標準およびコンソール幅)で折り返されています。

折り返しを避けるために、次のことを試してください。

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

問題 2 : 増加する進行コンソール バーを 1 行で表示したい場合、カーソル位置をリセットする必要があります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 stdout カプセル化環境では機能しません。

Eclipse、PyCharm などは stdout パイプを読み込んで、コンソール ビューにそのまま変更を出力します。

于 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、各行の先頭に a を追加して先頭に戻ります。

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

を使用してパーセンテージをパディングすることもできる%3d%%ため、一貫して右揃えになります。

于 2013-03-18T13:06:03.993 に答える