Ich frage mich, wie ich in Python wie in bestimmten C / C ++ - Programmen einen dieser raffinierten Konsolenzähler erstellen könnte.
Ich habe eine Schleife, die Dinge erledigt, und die aktuelle Ausgabe ist wie folgt:
Doing thing 0
Doing thing 1
Doing thing 2
...
Was sauberer wäre, wäre, nur die letzte Zeile zu aktualisieren.
X things done.
Ich habe dies in einer Reihe von Konsolenprogrammen gesehen und frage mich, ob / wie ich dies in Python tun würde.
print
: stackoverflow.com/a/8436827/1959808curses
ist ein Overkill (siehe die akzeptierte Antwort).Antworten:
Eine einfache Lösung besteht darin, nur
"\r"
vor die Zeichenfolge zu schreiben und keine neue Zeile hinzuzufügen. Wenn die Saite nie kürzer wird, ist dies ausreichend ...Etwas ausgefeilter ist ein Fortschrittsbalken ... das ist etwas, das ich benutze:
Sie rufen an,
startProgress
indem Sie die Beschreibung der Operation übergeben,progress(x)
wox
ist dann der Prozentsatz und schließlichendProgress()
quelle
restic
,flatpak
) können mehrere Zeilen der Konsolenausgabe aktualisieren. Wissen Sie zufällig, wie dies erreicht werden kann?Eine elegantere Lösung könnte sein:
Rufen Sie diese Funktion mit
value
und aufendvalue
, Ergebnis sollte seinHinweis: Python 2.x-Version hier .
quelle
In Python 3 können Sie dies tun, um in derselben Zeile zu drucken:
print('', end='\r')
Besonders nützlich, um die neuesten Updates und Fortschritte zu verfolgen.
Ich würde auch tqdm von hier aus empfehlen , wenn man den Fortschritt einer Schleife sehen möchte. Es druckt die aktuelle Iteration und die Gesamtiterationen als Fortschrittsbalken mit einer erwarteten Endzeit. Super nützlich und schnell. Funktioniert für Python2 und Python3.
quelle
Die andere Antwort mag besser sein, aber hier ist, was ich getan habe. Zuerst habe ich eine Funktion namens progress erstellt, die das Backspace-Zeichen druckt:
Dann habe ich es in einer Schleife in meiner Hauptfunktion so aufgerufen:
Dadurch wird natürlich die gesamte Zeile gelöscht, aber Sie können damit herumspielen, um genau das zu tun, was Sie wollen. Mit dieser Methode habe ich einen Fortschrittsbalken erstellt.
quelle
Für alle, die dieses Jahr später darauf stoßen (wie ich), habe ich die Methoden von 6502 ein wenig optimiert, damit der Fortschrittsbalken sowohl verringert als auch erhöht werden kann. Nützlich in etwas mehr Fällen. Danke 6502 für ein tolles Tool!
Grundsätzlich besteht der einzige Unterschied darin, dass bei jedem Aufruf von progress (x) die gesamte Zeile mit #s und -s geschrieben wird und der Cursor immer zum Anfang des Balkens zurückkehrt.
quelle
Wenn ich gut verstanden habe (nicht sicher), möchten Sie mit drucken
<CR>
und nicht<LR>
?Wenn dies möglich ist, solange das Konsolenterminal dies zulässt (es wird unterbrochen, wenn die Ausgabe in eine Datei umgeleitet wird).
quelle
Wenn wir uns die
print()
Funktion ansehen, kann dies ohne Verwendung der sys-Bibliothek erfolgenHier ist mein Code:
quelle
Ich habe das vor einiger Zeit geschrieben und bin sehr zufrieden damit. Fühlen Sie sich frei, es zu benutzen.
Es dauert ein
index
undtotal
und optionaltitle
oderbar_length
. Ersetzen Sie anschließend die Sanduhr durch ein Häkchen.⏳ Calculating: [████░░░░░░░░░░░░░░░░░░░░░] 18.0% done
✅ Calculating: [█████████████████████████] 100.0% done
Ich habe ein Beispiel beigefügt, das zum Testen ausgeführt werden kann.
Ich habe auch eine Version mit reaktionsschnellem Fortschrittsbalken, abhängig von der Terminalbreite,
shutil.get_terminal_size()
wenn dies von Interesse ist.quelle
Dem Beispiel von Aravind Voggu wurde etwas mehr Funktionalität hinzugefügt :
Jetzt können Sie mehrere Fortschrittsbalken generieren, ohne den vorherigen zu ersetzen.
Ich habe auch
name
als Wert mit einer festen Breite hinzugefügt .quelle
Der folgende Code zählt die Nachricht von 0 bis 137 alle 0,3 Sekunden und ersetzt die vorherige Nummer.
Anzahl der Symbole hinter der Bühne = Anzahl der Ziffern.
quelle