574 Stimmen

Textfortschrittsbalken im Terminal mit Blockzeichen

Ich habe eine einfache Konsolenanwendung zum Hoch- und Herunterladen von Dateien von einem FTP-Server unter Verwendung der ftplib geschrieben.

Ich möchte, dass die App eine Visualisierung des Download/Upload-Fortschritts für den Benutzer anzeigt; jedes Mal, wenn ein Datenpaket heruntergeladen wird, möchte ich, dass sie eine Fortschrittsaktualisierung bereitstellt, auch wenn es nur eine numerische Darstellung wie ein Prozentsatz ist.

Wichtig ist, dass ich vermeiden möchte, den gesamten Text zu löschen, der in den vorherigen Zeilen auf der Konsole ausgegeben wurde (d. h. ich möchte nicht das gesamte Terminal "löschen", während ich den aktualisierten Fortschritt ausdrucke).

Dies scheint eine ziemlich häufige Aufgabe - wie kann ich über die Erstellung eines Fortschrittsbalken oder ähnliche Visualisierung, die Ausgaben zu meiner Konsole unter Beibehaltung der vorherigen Programmausgabe gehen?

0 Stimmen

Sieht aus wie ein Duplikat dieser gestern gestellten Frage: stackoverflow.com/questions/3160699/python-progress-bar/3162864 Sie sollten also Fisch verwenden pypi.python.org/pypi/fish

37 Stimmen

"Verwenden Sie einfach eine grafische Benutzeroberfläche" verkennt, dass grafische Benutzeroberflächen in einigen Situationen (schnelle Lernkurve, Ad-hoc-Sondierungs- oder interaktive oder einmalige Aktivitäten) großartig sind, während Befehlszeilentools für andere Situationen großartig sind (erfahrene Benutzer, die Ad-hoc-Anwendungen im Handumdrehen zusammenstellen, um eine sorgfältig definierte Operation viele Male durchzuführen).

31 Stimmen

Ich habe für die Wiedereröffnung gestimmt. Die Frage scheint mir nicht zu weit gefasst zu sein.

0voto

Cold Diamondz Punkte 515

Nun, hier ist ein Code, der funktioniert und den ich vor dem Posten getestet habe:

import sys
def prg(prog, fillchar, emptchar):
    fillt = 0
    emptt = 20
    if prog < 100 and prog > 0:
        prog2 = prog/5
        fillt = fillt + prog2
        emptt = emptt - prog2
        sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]" + str(prog) + "%")
        sys.stdout.flush()
    elif prog >= 100:
        prog = 100
        prog2 = prog/5
        fillt = fillt + prog2
        emptt = emptt - prog2
        sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]" + str(prog) + "%" + "\nDone!")
        sys.stdout.flush()
    elif prog < 0:
        prog = 0
        prog2 = prog/5
        fillt = fillt + prog2
        emptt = emptt - prog2
        sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]" + str(prog) + "%" + "\nHalted!")
        sys.stdout.flush()

Vorteile:

  • 20-Zeichen-Leiste (1 Zeichen für jeweils 5 (zahlenmäßig))
  • Benutzerdefinierte Füllzeichen
  • Benutzerdefinierte leere Zeichen
  • Halt (beliebige Zahl unter 0)
  • Erledigt (100 und jede Zahl über 100)
  • Fortschrittszähler (0-100 (Unter- und Überschreitungen werden für Sonderfunktionen verwendet))
  • Prozentzahl neben dem Balken, und es ist eine einzige Zeile

Nachteile:

  • Unterstützt nur ganze Zahlen (Es kann jedoch so modifiziert werden, dass es diese unterstützt, indem die Division zu einer ganzzahligen Division gemacht wird, also ändern Sie einfach prog2 = prog/5 a prog2 = int(prog/5) )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X