Source code for scisalt.utils.progressbar

import sys as _sys
import time as _time
import datetime as _dt


[docs]class progressbar(object): """ .. versionadded:: 1.3 Creates a progress bar with a number of steps *total* and a length of *length*. """ def __init__(self, total, length=20): print('') self._step = 0 self._total = total self._length = length self._timestamp = None self._timestart = None @property def step(self): """ The current step. """ return self._step @step.setter def step(self, step): lasttime = self._timestamp self._timestamp = _time.perf_counter() if lasttime is not None: dt = self._timestamp-lasttime time_remain = (self._total - step - 1) * dt remain_str = ', {} remain'.format(str(_dt.timedelta(seconds=time_remain))) else: remain_str = '' if self._timestart is None: self._timestart = self._timestamp elapsed_str = '' else: elapsed = self._timestamp-self._timestart elapsed_str = ', {} elapsed'.format(str(_dt.timedelta(seconds=elapsed))) if step > self._total: step = self._total self._step = step step = step - 1 bartext = '#'*round(step/self._total * self._length) + ' '*round((self._total-step)/self._total * self._length) text = '\r\033[1AOn step {} of {} ({:0.1f}% completed{}{}):\n[ {} ]'.format(self._step, self._total, 100.0*step/self._total, remain_str, elapsed_str, bartext) _sys.stdout.write(text) _sys.stdout.flush() # print(text) def __enter__(self): return self def __exit__(self, type, value, traceback): text = '\r\033[K\033[1A\033[K' _sys.stdout.write(text) _sys.stdout.flush()