Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

#!/usr/bin/env python 

# This file is part of the pyMOR project (http://www.pymor.org). 

# Copyright Holders: Rene Milk, Stephan Rave, Felix Schindler 

# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) 

 

import sys 

 

############################################################ 

# 

# A progress bar that actually shows progress! 

# 

# Source: 

# http://code.activestate.com/recipes/168639-progress-bar-class/ 

# 

############################################################ 

 

 

class ProgressBar: 

    """ Creates a text-based progress bar. Call the object with the `print` 

        command to see the progress bar, which looks something like this:: 

 

        [=======>        22%                  ] 

 

        You may specify the progress bar's width, min and max values on init. 

    """ 

 

    def __init__(self, minValue=0, maxValue=100, totalWidth=79): 

        self.progBar = "[]"  # This holds the progress bar string 

        self.min = minValue 

        self.max = maxValue 

        self.width = totalWidth 

        self.amount = minValue  # When amount == max, we are 100% done 

        self.update_amount(self.amount)  # Build progress bar string 

 

    def update_amount(self, newAmount=0): 

        """ Update the progress bar with the new amount (with min and max 

            values set at initialization; if it is over or under, it takes the 

            min or max value as a default. """ 

        if newAmount < self.min: 

            newAmount = self.min 

        if newAmount > self.max: 

            newAmount = self.max 

        self.amount = newAmount 

 

        # Figure out the new percent done, round to an integer 

        diffFromMin = float(self.amount - self.min) 

        percentDone = (diffFromMin / float(self.max - self.min)) * 100.0 

        percentDone = int(round(percentDone)) 

 

        # Figure out how many hash bars the percentage should be 

        allFull = self.width - 2 

        numHashes = (percentDone / 100.0) * allFull 

        numHashes = int(round(numHashes)) 

 

        # Build a progress bar with an arrow of equal signs; special cases for 

        # empty and full 

        if numHashes == 0: 

            self.progBar = "[>%s]" % (' ' * (allFull - 1)) 

        elif numHashes == allFull: 

            self.progBar = "[%s]" % ('=' * allFull) 

        else: 

            self.progBar = "[%s>%s]" % ('=' * (numHashes - 1), 

                                        ' ' * (allFull - numHashes)) 

 

        # figure out where to put the percentage, roughly centered 

        percentPlace = (len(self.progBar) / 2) - len(str(percentDone)) 

        percentString = str(percentDone) + "%" 

 

        # slice the percentage into the bar 

        self.progBar = ''.join([self.progBar[0:percentPlace], percentString, 

                                self.progBar[percentPlace + len(percentString):] 

                                ]) 

 

    def __str__(self): 

        return str(self.progBar) 

 

    def __call__(self, value): 

        """ Increases the amount by value, and writes to stdout. Prints a 

            carriage return first, so it will overwrite the current line in 

            stdout.""" 

        if self.amount < self.max: 

            print '\r', 

            self.update_amount(self.amount + value) 

            sys.stdout.write(str(self)) 

            sys.stdout.write(self.amount < self.max and "\r" or "\n") 

            sys.stdout.flush() 

 

    def setMaximum(self, value): 

        self.max = value 

 

    def maximum(self): 

        return self.max 

 

if __name__ == '__main__': 

    from time import sleep 

    p = ProgressBar() 

    for i in range(0, 201): 

        p(1) 

        if i == 90: 

            p.max = 200 

        sleep(0.02)