\ r w Pythonie nie usuwa całej linii
Mam dość złożony problem, ale tutaj jest „najprostsza wersja”, abyś mógł go lepiej zrozumieć.
import time
for i in range(10):
time.sleep(1)
print('{}\r'.format(i), end="")
i tutaj wszystko działa dobrze, problem pojawia się, gdy próbuję odliczać
import time
for i in range(10):
time.sleep(1)
print('{}\r'.format(10-i), end="")
wyjście to 10 ... następnie 90 ... 80 ... 70 i tak dalej, wydaje się, że jeśli drugi szyfr z 10 nie zostanie anulowany. czy ktoś może mi powiedzieć dlaczego?
Odpowiedzi
\rprzenosi kursor na początek wiersza, ale nie „czyści” niczego już wydrukowanego, chyba że go nadpiszesz (może to zależeć od platformy). W ten sposób 0postać pozostanie widoczna. Możesz sobie z tym poradzić, zawsze drukując kolumnę o stałej szerokości, tak aby puste spacje były drukowane, aby wyczyścić wszystko, co zostało wcześniej. Możesz także po prostu umieścić CR w endparam.
A zatem:
import time
for i in range(10):
time.sleep(1)
print('{: <3}'.format(10-i), end='\r')
Używa specyfikatora formatu, aby wskazać wypełnioną <spacjami, wyrównaną do 3lewej kolumnę o szerokości. Możesz zmienić na 3wyższą liczbę w zależności od tego, ile cyfr potrzebuje Twój licznik.
Jest to spowodowane prostym błędem, brakuje spacji przed \ r:
Twój kod:
print('{}\r'.format(10-i), end="")
# > 10,90,80
Zmień to na:
print('{} \r'.format(10-i),
#> 10, 9, 8
Problem jest jak stare maszyny do pisania, kiedy naciskasz klawisz \rpowrotu karetki, przechodzi on do początku wiersza i zmienia jeden znak stamtąd. więc 10 stanie się 90, gdy zmieni się pierwszy znak.
import time
for i in range(10):
time.sleep(1)
print('{:02d}'.format(10-i), end="\r")
Więc jednym potencjalnym rozwiązaniem jest naprawienie szerokości. tutaj zrobiłem 2 cyfry