2013-03-06 2 views
0

Python не продолжает заменять одну и ту же строку в терминале, но заменяет «имя» и добавляет индикатор выполнения в новую строку, что приводит к огромному стекному индикатору выполнения ... это только происходит, когда я использую «\ n» перед «именем». Как я могу заставить результат выглядеть так?строки укладки python в терминале

[###                ] 4% 
name2 

питон

mylist = ['name1', 'name2', 'name3',...'name66'] 

for name in mylist: 
    sys.stdout.write('\r[%-66s] %d%%' % ('#'*prog, (prog*1.51515151515))+'\n'+name) 
    sys.stdout.flush() 
+4

Вот что делает '\ n'. Каков твой вопрос? – NPE

+0

Да, я действительно не понимаю ваш вопрос. Как это выглядит сейчас? – Colleen

+0

Ничего себе, идиот, я хочу, чтобы «имя» было обернуто на следующую строку без укладки прографов. – user1442957

ответ

2

Вы можете попробовать progressbar для этого. Он работает хорошо и легко настраивается в моем опыте.

1

Вы можете достичь этого, используя достаточное количество пробелов, которые выглядят как новая строка, но на самом деле не используют символ новой строки. Затем используйте обратный символ \b, чтобы переместить курсор обратно в начало строки и перезаписать все, что вы написали.

Я немного расширил ваш пример, чтобы сделать его исполняемым сценарием, бросив там спать и увеличивая вручную prog.

import sys 
from time import sleep 
import os 

# Get the number of columns in the terminal 
rows, columns = os.popen('stty size', 'r').read().split() 
columns = int(columns) 

mylist = ['name1', 'name2', 'name3','name4'] 
prog = 0 
for name in mylist: 
    prog += 10 
    bar = '[%-66s] %d%%' % ('#'*prog, (prog*1.51515151515)) 
    spaces_left = columns-len(bar) 
    sys.stdout.write(bar+(" "*spaces_left)+name+('\b'*(len(name) + columns))) 
    sys.stdout.flush() 
    sleep(.5)