Progress Bar in python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jerome
User
Beiträge: 13
Registriert: Freitag 10. Juli 2009, 23:02
Kontaktdaten:

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()
jerome
User
Beiträge: 13
Registriert: Freitag 10. Juli 2009, 23:02
Kontaktdaten:

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.
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?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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.
jerome
User
Beiträge: 13
Registriert: Freitag 10. Juli 2009, 23:02
Kontaktdaten:

danke euch allen ich glaub ich komm jetzt klar.

@jerch

das ist mal eine coole animation als progress bar.

gruß
jerome
Antworten