Прежде чем перезаписывать одну и ту же строку, вам необходимо очистить по крайней мере позиции, где точки с пробелами.
def processing_flush(n, index=5):
sys.stdout.write("\rProcessing %s" % (index * " "))
sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
sys.stdout.flush()
Приведенный выше код может привести к кратковременному мерцанию. В вашем конкретном случае достаточно, чтобы очистить линию, когда n % index
становится 0:
def processing_flush(n, index=5):
if n % index == 0:
sys.stdout.write("\rProcessing %s" % (index * " "))
sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
sys.stdout.flush()
Или даже лучше всегда писать index-1
символы:
def processing_flush(n, index=5):
sys.stdout.write("\rProcessing %s%s" % ((n % index)* ".", (index - 1 - (n % index))* " "))
sys.stdout.flush()
Edit 1: Или, если вы предпочитаете иметь курсор всегда после последней точки:
def processing_flush(n, index=5):
sys.stdout.write("\rProcessing %s%s" % ((n % index)* ".", (index - 1 - (n % index))* " "))
sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
sys.stdout.flush()
Edit 2: Или, если вы предпочитаете, чтобы курсор всегда в начале строки:
def processing_flush(n, index=5):
sys.stdout.write("Processing %s%s\r" % ((n % index)* ".", (index - 1 - (n % index))* " "))
sys.stdout.flush()
Причина заключается в том, что ваша оболочка запоминает оставшиеся символы предыдущей строки, если вы перезаписать только первую часть.
Ничего себе это было так просто !!. Спасибо, Йоханнес, я потратил несколько часов на поиски в Google, чтобы найти решение !!! –
Johannes в командной строке окна выглядит лучше второго решения (визуально). С 3) решением в конце всегда идет указатель под подсказкой подсказки. –
@Gianni: Combine 3 и 2: Скопируйте вторую строку из решения 2 в решение 3 перед 'sys.stdout.flush()'. –