Estou me perguntando como poderia criar um desses contadores de console bacanas em Python, como em certos programas C / C ++.
Eu tenho um loop fazendo coisas e a saída atual é ao longo das linhas de:
Doing thing 0
Doing thing 1
Doing thing 2
...
o que seria mais legal seria apenas atualizar a última linha;
X things done.
Já vi isso em vários programas de console e estou me perguntando se / como faria isso em Python.
print
: stackoverflow.com/a/8436827/1959808curses
é um exagero (veja a resposta aceita).Respostas:
Uma solução fácil é apenas escrever
"\r"
antes da string e não adicionar uma nova linha; se a string nunca ficar mais curta, isso é suficiente ...Um pouco mais sofisticada é uma barra de progresso ... isso é algo que estou usando:
Você chama de
startProgress
passar a descrição da operação, entãoprogress(x)
ondex
está a porcentagem e finalmenteendProgress()
fonte
restic
,flatpak
) podem atualizar várias linhas de saída do console. Você sabe por acaso como isso pode ser alcançado?Uma solução mais elegante poderia ser:
chame esta função com
value
eendvalue
, o resultado deve serNota: versão Python 2.x aqui .
fonte
No python 3, você pode fazer isso para imprimir na mesma linha:
print('', end='\r')
Especialmente útil para acompanhar as últimas atualizações e o progresso.
Eu também recomendaria tqdm daqui se alguém quiser ver o progresso de um loop. Ele imprime a iteração atual e o total de iterações como uma barra de progressão com um tempo previsto de conclusão. Super útil e rápido. Funciona para python2 e python3.
fonte
A outra resposta pode ser melhor, mas aqui está o que eu estava fazendo. Primeiro, fiz uma função chamada progresso que imprime o caractere de retrocesso:
Então eu chamei em um loop em minha função principal assim:
É claro que isso apagará toda a linha, mas você pode mexer com ela para fazer exatamente o que deseja. Acabei fazendo uma barra de progresso usando este método.
fonte
Para qualquer um que se deparar com isso anos depois (como eu fiz), ajustei um pouco os métodos do 6502 para permitir que a barra de progresso diminuísse e aumentasse. Útil em mais casos. Obrigado 6502 por uma ótima ferramenta!
Basicamente, a única diferença é que toda a linha de #s e -s é escrita cada vez que progress (x) é chamado, e o cursor sempre é retornado ao início da barra.
fonte
Se entendi bem (não tenho certeza) quer imprimir usando
<CR>
e não<LR>
?Se for assim, isso é possível, desde que o terminal do console permita isso (ele será interrompido quando a saída si for redirecionada para um arquivo).
fonte
Isso pode ser feito sem usar a biblioteca sys se olharmos para a
print()
funçãoAqui está o meu código:
fonte
Eu escrevi isso há um tempo e muito feliz com isso. Sinta-se livre para usá-lo.
Leva um
index
etotal
e opcionalmentetitle
oubar_length
. Uma vez feito isso, substitui a ampulheta por uma marca de seleção.⏳ Calculating: [████░░░░░░░░░░░░░░░░░░░░░] 18.0% done
✅ Calculating: [█████████████████████████] 100.0% done
Incluí um exemplo que pode ser executado para testá-lo.
Eu também tenho uma versão com barra de progresso responsiva dependendo da largura do terminal usando
shutil.get_terminal_size()
se for de interesse.fonte
Adicionou um pouco mais de funcionalidade ao exemplo do Aravind Voggu :
Agora você pode gerar várias barras de progresso sem substituir a anterior.
Eu também adicionei
name
como um valor com uma largura fixa.fonte
O código abaixo contará a mensagem de 0 a 137 a cada 0,3 segundo, substituindo o número anterior.
Número do símbolo no backstage = número de dígitos.
fonte