2015-11-20 2 views
3

Мой прогресс бар достигает 100%, а затем бросает ошибкуPython Progress Bar ValueError: Значение вне диапазона

from progressbar import Percentage, ProgressBar,Bar,ETA 

pbar = ProgressBar(widgets=[Bar('=', '[', ']'), ' ', 
              Percentage(), ' ', 
              ETA()]).start() 
      for i,row in enumerate(cursor): 

       ''' 
       do some work here 

       ''' 

       pbar.update(i) 

вот что я получаю

Traceback (most recent call last):=========================] 100% ETA: 0:00:00 
    File "X:\src\dbtest\PymssqlCheck.py", line 27, in <module> 
    fiddler.getRows(condetails, dbdetails, 'compliance', 'doctable', '*', '1000') 
    File "X:\src\utilities\fiddler.py", line 45, in getRows 
    pbar.update(i) 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 271, in update 
    raise ValueError('Value out of range') 
ValueError: Value out of range 

почему она достигает 100%, а затем потерпеть неудачу? Я использую

https://github.com/niltonvolpato/python-progressbar

я даже пытался

i=0         
      for row in cursor: 

       ''' do some work here ''' 

       if i < numrows: 
        pbar.update(i) 
        i=i+1 

, но я все еще получаю ту же ошибку

Редактировать

я попытался Tomasz Jakub Rup ответ

pbar = ProgressBar(widgets=[Bar('=', '[', ']'), ' ', 
             Percentage(), ' ', 
             ETA()]) 
for row in pbar(cursor): 
    ''' do some work here ''' 

и я получаю

File "X:\fiddler.py", line 41, in getRows 
    for row in pbar(cursor): 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 180, in __next__ 
    if self.start_time is None: self.start() 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 311, in start 
    self.update(0) 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 283, in update 
    self.fd.write(self._format_line() + '\r') 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 243, in _format_line 
    widgets = ''.join(self._format_widgets()) 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 223, in _format_widgets 
    widget = format_updatable(widget, self) 
    File "X:\Anaconda2\lib\site-packages\progressbar\widgets.py", line 38, in format_updatable 
    if hasattr(updatable, 'update'): return updatable.update(pbar) 
    File "X:\Anaconda2\lib\site-packages\progressbar\widgets.py", line 184, in update 
    return '%3d%%' % pbar.percentage() 
    File "X:\Anaconda2\lib\site-packages\progressbar\__init__.py", line 208, in percentage 
    return self.currval * 100.0/self.maxval 
TypeError: unsupported operand type(s) for /: 'float' and 'classobj' 

любая идея, почему?

+0

Что такое курсор? Список? Dict? –

+0

Я думаю, что это список. его курсор pymssql для выполнения запросов – AbtPst

ответ

1

Дэвид и Томаш, вы оба пришли очень близко. раствор, который работал, составляет

pbar = ProgressBar(widgets=[Bar('>', '[', ']'), ' ', 
              Percentage(), ' ', 
              ETA()],maxval=someMaxValue) 
      for row in pbar(cursor): 
       ''' do some work ''' 
+1

Отличная работа! В документации есть опечатка maxval <-max_val !!! Спасибо! – layser

2

Поскольку индикатор выполнения по умолчанию равен 100. Вы должны указать maxval=N, если у вас есть N шагов.

Например:

from progressbar import Percentage, ProgressBar,Bar,ETA 

N = 300 

pbar = ProgressBar(widgets=[Bar('=', '[', ']'), ' ', Percentage(), ' ', ETA()], 
        maxval=N).start() 

for i in range(N+1): 
    pbar.update(i) 
0

Try:

pbar = ProgressBar(widgets=[Bar('=', '[', ']'), ' ', 
             Percentage(), ' ', 
             ETA()]) 
for row in pbar(cursor.fetchall()): 
    ''' do some work here ''' 

В этом случае Вам не нужно обновлять pbar и не нужно, чтобы начать и закончить pbar.

+0

спасибо, но я все равно получаю ту же ошибку – AbtPst

+0

Я пробовал ваш подход, но теперь у меня другая ошибка. см. edit – AbtPst

+0

Мне нравятся универсальные решения. Cursor.fetchall() возвращает список. –