2017-06-04 3 views
0

So habe ich diese einfache statusbar Umsetzung:Carriage Return ohne Zeilenumbruch auf Windows

def status_update(current, top, label="Progress"): 
    workdone = current/top 
    print("\r{0:s}: [{1:30s}] {2:.1f}%".format(label,'#' * int(workdone * 30), workdone*100), end="", flush=True) 
    if workdone == 1: 
     print() 

Arbeiten wie auf Linux erwartet.

Auf Windows (10, in meinem Fall) jedoch \r offenbar erstellt eine neue Zeile für jeden Ausgang, anstatt das vorherige zu überschreiben.

Wie kann ich das stoppen? (Vorzugsweise in einer Weise, die Linux-Kompatibilität nicht bricht.)

+0

Die klassische Windows-Konsole geht automatisch die Cursor in der nächsten Zeile, wenn die letzte Spalte geschrieben wird. In Windows 10 kann dies durch Verwendung des virtuellen Terminalmodus deaktiviert werden. – eryksun

Antwort

1

Dies ist möglicherweise nicht der beste Weg, dies zu tun, aber funktioniert. Benutze einfach \ b.

def status_update(current, top, label="Progress"): 
    workdone = current/top 
    if not hasattr(status_update, "length"): 
     status_update.length = 0 
    str1="{0:s}: [{1:30s}] {2:.1f}%".format(label,'#' * int(workdone * 30), workdone*100) 
    print(('\b'*status_update.length)+str1, end="", flush=True) 
    status_update.length=len(str1) 
    if workdone == 1: 
     print() 

hier bin ich backspacing Anzahl der Zeichen im letzten Aufruf von status_update gedruckt

Verwandte Themen