\ r w Pythonie nie usuwa całej linii

Aug 31 2020

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

2 tzaman Aug 31 2020 at 01:46

\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.

1 ManasSambare Aug 31 2020 at 01:42

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
1 venky__ Aug 31 2020 at 01:44

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