2017-08-17 12 views
0

私はPython 3.xを使用しており、progressbar2ライブラリをダウンロードしました。しかし、私は自分のプログラムでそれを使う方法に苦労しています。指定した範囲があればすべてうまく動作しますが、プログレスバーを自分のコードでリアルタイムに更新するにはどうすればよいですか?私はプログレスバーが最初に表示されているテキストリストのすべての反復で20%ジャンプし、結果をプリントアウトするときに進行状況をリフレッシュすることを期待しています。CLIのPython ProgressBar

私はまた、Stackの鉱山に似た別の質問を見つけましたが、既にそこにあるので、progressbar2ライブラリを使用することをお勧めします。次のことを考えてみましょう:

import time 
import progressbar 

texts = ['a', 'b', 'c', 'd', 'e'] 

def basic_widget_example (texts): 

    widgets = [progressbar.Percentage(), progressbar.Bar()] 
    bar = progressbar.ProgressBar (widgets = widgets, max_value = len (texts)).start() 
    for i in range (len (texts)): 
     print (texts [i]) 
     time.sleep (0.1) 
     bar.update (i + 1) 
    bar.finish() 

結果:

N/A%|                            |a 
20%|######################                       |b 
40%|############################################                 |c 
60%|##################################################################            |d 
80%|########################################################################################      |e 
100%|###############################################################################################################| 

私はそれは次のようになりたいと思います:

100%|#############################################################| 
a 
b                              
c                              
d                              
e  

一つの解決策は、forループ2を作成することですが、あなたが見ることができるようにプログレスバーの表示が正確でなくなったり、タスクに同期したりしています。タスクが完了するまでに2分かかることがあるにもかかわらず、プログレスバーには1秒未満で100%が表示されます。できるだけ正確に近いところでこれを達成する方法はありますか?

def basic_widget_example (texts): 

    widgets = [progressbar.Percentage(), progressbar.Bar()] 
    bar = progressbar.ProgressBar (widgets = widgets, max_value = len (texts)).start() 
    for i in range (len (texts)): 
     # Do something 
     time.sleep (0.1) 
     bar.update (i + 1) 
    bar.finish() 

    for text in texts: 
     print (text) 

答えて

0

私はプログレスバーの使い方を誤解しています。プログレスバーは、ユーザーに通信する必要がない場合に計算が行われていることをユーザーに知らせるためのものです。これは、一部の文字列の操作や、一連のデータからリストを作成することがシーンの背後で行われている場合に便利です。結果が得られ、画面に出力する準備ができたら、その時点で進行状況バーが必要なくなるでしょう。

たとえば、1から50までの整数のリストを作成し、1を追加して(バックグラウンドプロセス)、別のリストに追加して出力をシミュレートします。

lst = [i for i in range (50)] 
basic_widget_example (lst) 

def basic_widget_example (lst): 

    newlist = [] 

    widgets = [progressbar.Percentage(), progressbar.Bar()] 
    bar = progressbar.ProgressBar (widgets = widgets, max_value = len (lst)).start() 
    for i in range (len (lst)): 
     # Do something 
     newlist = [x + 1 for x in lst] 
     time.sleep (0.1) 
     bar.update (i + 1) 
    bar.finish() 

    print (newlist [:5]) 

結果:

100%|###############################################################################################################| 
[1, 2, 3, 4, 5] 

プログレスバーが「MAX_VALUE」で指定された50で、リストの長さでインクリメントされています。これは、繰り返しごとに2つの「#」を生成します。

time.sleep(値)は、進行状況バーの完了に要する時間に相当します。私の例では、50回の反復* 0.1秒= 5秒です。つまり、プログレスバーは5秒で100%完成します。これはリアルタイムではありません。リアルタイムであれば、睡眠の値を思いつくためにさらに計算が必要です。 1つのアイデアは、各反復に要する時間を計算するか、平均をとってそれをtime.sleepの値として使用することです。