Seite 1 von 1

Progress Bar in python

Verfasst: Samstag 14. November 2009, 16:07
von jerome
Hallo Python Community ,

ich versuche folgenden Code zu verstehen. Es sollte ein Progress Bar sein. Aber ich komm nicht dahinter wie das geht. Ich will sowas für das kopieren einer datei in ein verzeichniss verwenden.
( der Code stammt von: http://snippets.dzone.com/posts/show/5432 )

wäre sehr dankbar wenn mir jemand das ganze erläutern könnte oder ein beispiel zeigen wie ich den Code nutzen kann. Vielen Dank.

Code: Alles auswählen

class Bar:
	def __init__(self):
		self.len = 0
		self.chars = (' ', '+')
		self.wrap = ('[', ']')
		self.filledc = 0
		self.blank = 0

	def fill(self, i):
		assert not (i > 100) or (i < 0)
		self._setP(i)

	def _setP(self, p):
		self.filledc = int(round(float(self.len*p)/100))
		self.blank = int(round(float(100-self.len)*p/100))

	def show(self):
		out = []
		out.append(self.wrap[0])
		out.append(self.filledc*self.chars[1])
		out.append(self.blank*self.chars[0])
		out.append(self.wrap[1])
		return "".join(out)

b = Bar()
b.len = 20
b.fill(20)
print b.show()

Verfasst: Samstag 14. November 2009, 16:13
von lunar
Es gibt ein progressbar-Modul.

Verfasst: Samstag 14. November 2009, 16:19
von jerome
Ich weiß und das peile ich erst recht nicht. Naja kann mir auch vorstellen das es nicht so eine Form hat wie der Code

Ich liebe diese : " [++++ ] " in der Konsole

ich würd da "+ " nur in ein " = " umwandeln damit es
so aussieht "[===== ]" und wenn ich es mehr verstehe will ich sowas wie Fedora yum haben das ist am schönsten. Naja aber danke.

Verfasst: Samstag 14. November 2009, 18:52
von problembär

Code: Alles auswählen

import time

class Bar:
    def __init__(self):
        self.len = 0
        self.chars = (' ', '=')
        self.wrap = ('[', ']')
        self.filledc = 0
        self.blank = 0

    def fill(self, i):
        assert not (i > 100) or (i < 0)
        self._setP(i)

    def _setP(self, p):
        self.filledc = int(round(float(self.len*p)/100))
        self.blank = int(round(float(100-self.len)*p/100))

    def show(self):
        out = []
        out.append(self.wrap[0])
        out.append(self.filledc*self.chars[1])
        out.append(self.blank*self.chars[0])
        out.append(self.wrap[1])
        return "".join(out)

b = Bar()

for i in range(1, 110, 10):
    b.len = i
    b.fill(20)
    time.sleep(0.2)
    print b.show()
Besser?

Verfasst: Samstag 14. November 2009, 22:42
von CM
Oder dies? (Kann etwas dauern, bevor es geladen wird.)
Die TxtScale-Klasse sollte Deinen Anforderungen genügen.

Ich bin selber mal über den Code gestolpert und habe keine Ahnung woher er kommt. Wenn jemand weiß wo der her ist: Lasst es mich bitte wissen.

HTH
Christian

Verfasst: Sonntag 15. November 2009, 02:35
von jerch
Vielleicht hilft Dir das hier weiter (hat mir zumindest bisher gereicht):

Code: Alles auswählen

def bar(value, minv=0, maxv=99, fill='#', empty='.', length=20):
    filled = int(length * value / (maxv - minv))
    return fill * filled + empty * (length - filled)

def spin(s='|/-\\', bounce=False):
    while s:
        for e in s:
            yield e
        if bounce and len(s)>2:
            for e in s[-2:0:-1]:
                yield e

def percent(value, minv=0, maxv=99):
    return '%3d%%' % (value * 100 / (maxv - minv))

if __name__ == '__main__':
    import sys, time
#    c = spin(' .oO', True)
    c = spin(map(lambda x : ''.join('#' if i==x else ' '  for i in xrange(10)),
                    xrange(10)), True)
    for i in xrange(100):
        sys.stdout.write('\r[%s|%s] %s' % (c.next(), bar(i), percent(i)))
        sys.stdout.flush()
        time.sleep(.1)
    print
Mit spin() kann man einfache einzeilige Animationen machen, um bei langsamem Fortschritt dem Nutzer noch Aktivität anzuzeigen.

danke euch allen

Verfasst: Montag 16. November 2009, 15:53
von jerome
danke euch allen ich glaub ich komm jetzt klar.

@jerch

das ist mal eine coole animation als progress bar.

gruß
jerome