[python-brasil] Controlar o sys.stdout.write para fazer uma barra de progresso

373 views
Skip to first unread message

victorjabur

unread,
Mar 10, 2011, 7:49:41 PM3/10/11
to python...@yahoogrupos.com.br
 

Boa Noite galera,

Estou querendo controlar o sys.stdout.write para fazer uma barrinha de progresso, tipo a do wget no shell, segue uma imagem abaixo:

http://i55.tinypic.com/avo0tl.png

Quero fazer o seguinte:

Deixar 100 caracteres entre dois colchetes, por exemplo:

[==========> ]

Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
colchetes deve permanacer parado e no print sysout eu teria que deletar caracteres para obter este efeito.

Alguém tem idéia disso ?

Obrigado.
Victor Jabur

__._,_.___
Atividade nos últimos dias:
.

__,_._,___

David Kwast

unread,
Mar 10, 2011, 8:15:38 PM3/10/11
to python...@yahoogrupos.com.br
 

011/3/10 victorjabur <victo...@gmail.com>



> Estou querendo controlar o sys.stdout.write para fazer uma barrinha de
> progresso, tipo a do wget no shell, segue uma imagem abaixo:
>
> http://i55.tinypic.com/avo0tl.png
>
> Quero fazer o seguinte:
>
> Deixar 100 caracteres entre dois colchetes, por exemplo:
>
> [==========> ]
>
> Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
> colchetes deve permanacer parado e no print sysout eu teria que deletar
> caracteres para obter este efeito.
>
> Alguém tem idéia disso ?
>

A única coisa que eu sei de console é que o "curses" ajuda.

http://docs.python.org/dev/howto/curses.html
http://docs.python.org/dev/library/curses.html#module-curses

buscando no google:
http://code.activestate.com/recipes/168639-progress-bar-class/

[As partes desta mensagem que não continham texto foram removidas]

__._,_.___
.

__,_._,___

Eduardo T. Cardoso

unread,
Mar 10, 2011, 8:29:45 PM3/10/11
to python...@yahoogrupos.com.br, victorjabur
 

2011/3/10 victorjabur <victo...@gmail.com>:


> Boa Noite galera,
>
> Estou querendo controlar o sys.stdout.write para fazer uma barrinha de progresso, tipo a do wget no shell, segue uma imagem abaixo:
>
> http://i55.tinypic.com/avo0tl.png
>
> Quero fazer o seguinte:
>
> Deixar 100 caracteres entre dois colchetes, por exemplo:
>
> [==========>                                        ]
>
> Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
> colchetes deve permanacer parado e no print sysout eu teria que deletar caracteres para obter este efeito.
>
> Alguém tem idéia disso ?

Oi Victor,

Eu já fiz algo assim. Eu usava o caractere '\b', que apaga caracteres
da linha atual. Se você der um '\n', já era, não apaga mais nada dali
pra trás. Então o que eu fazia era imprimir sem o '\n' e a cada
atualização eu imprimia antes uma quantidade obscena de '\b's,
efetivamente apagando tudo que eu tenha escrito na última linha.

Como você pode ver, é um método meio gambiarrento, e dificilmente vai
ser possível confiar nisso. Como era pra projetinhos pequenos e
pessoais, o "works for me" foi suficiente. Se você quiser algo mais
confiável, talvez seja melhor pesquisar sobre curses como sugeriram
mesmo...

[]s
Eduardo

__._,_.___
.

__,_._,___

@maltzsama

unread,
Mar 10, 2011, 9:00:58 PM3/10/11
to python...@yahoogrupos.com.br
 

esta usando linux? Procura o pythondialog, é como o dialog do shell...
http://pythondialog.sourceforge.net/
é divertido. Se precisar de algo mais complexo use o ncurses mesmo.

Demetrius Albuquerque
Linux & SO www.maltzsama.blogspot.com

Em 10 de março de 2011 21:29, Eduardo T. Cardoso
<edu...@vircio.com.br>escreveu:

[As partes desta mensagem que não continham texto foram removidas]

__._,_.___
.

__,_._,___

Danilo Cabello

unread,
Mar 10, 2011, 10:24:00 PM3/10/11
to python...@yahoogrupos.com.br
 

Victor,

2011/3/10 victorjabur <victo...@gmail.com>:


> Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
> colchetes deve permanacer parado e no print sysout eu teria que deletar caracteres para obter este efeito.
>
> Alguém tem idéia disso ?

Uma maneira simples de fazer isso:

import sys
import time
size = 50
for i in range(size):
sys.stdout.write("[%s%s]\r" % ('*' * i, ' ' * (size - i - 1)))
sys.stdout.flush()
time.sleep(.25)

Os pontos principais do código são:
- Use sys.stdout.write, ele não coloca o \n como o print faz, você
pode utilizar print com vírgula no final também (python 2.x)
- Dê um flush pro output ser atualizado
- Use uma conta simples para imprimir espaços no meio da barra, assim
seu colchetes fica lá no canto parado

Abraços,

--
Danilo Cabello
Bottom-poster maniac.

__._,_.___
.

__,_._,___

Leonardo Santagada

unread,
Mar 10, 2011, 10:42:26 PM3/10/11
to python...@yahoogrupos.com.br
 

Eu não usaria curses, usaria ou o metodo do Danilo (parece mais limpo)
ou o do Eduardo (parece mais simples). Curses e outras dependencias só
pra isso só vão te dar dor de cabeça quando tu quiser rodar o software
em outro lugar, além de complicarem as coisas quando tu tiver
acessando esse software de um ssh lento por exemplo (Tipo usando EDGE
ou linha discada para outro continente :).

2011/3/11 Danilo Cabello <danilo....@gmail.com>:


> Victor,
>
> 2011/3/10 victorjabur <victo...@gmail.com>:
>> Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
>> colchetes deve permanacer parado e no print sysout eu teria que deletar caracteres para obter este efeito.
>>
>> Alguém tem idéia disso ?
>
> Uma maneira simples de fazer isso:
>
> import sys
> import time
> size = 50
> for i in range(size):
>    sys.stdout.write("[%s%s]\r" % ('*' * i, ' ' * (size - i - 1)))
>    sys.stdout.flush()
>    time.sleep(.25)
>
> Os pontos principais do código são:
> - Use sys.stdout.write, ele não coloca o \n como o print faz, você
> pode utilizar print com vírgula no final também (python 2.x)
> - Dê um flush pro output ser atualizado
> - Use uma conta simples para imprimir espaços no meio da barra, assim
> seu colchetes fica lá no canto parado
>
> Abraços,
>
> --
> Danilo Cabello
> Bottom-poster maniac.
>
>

> ------------------------------------
>
> Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
> Links do Yahoo! Grupos
>
>
>

--
Leonardo Santagada

__._,_.___
.

__,_._,___

victorjabur

unread,
Mar 11, 2011, 7:58:29 AM3/11/11
to python...@yahoogrupos.com.br
 

Muito obrigado mesmo pessoal.

É sempre contar com a experiência de bons programadores.

Valew.
Victor Jabur

--- Em python...@yahoogrupos.com.br, Danilo Cabello <danilo.cabello@...> escreveu
>
> Victor,
>
> 2011/3/10 victorjabur <victorjabur@...>:


> > Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
> > colchetes deve permanacer parado e no print sysout eu teria que deletar caracteres para obter este efeito.
> >
> > Alguém tem idéia disso ?
>
> Uma maneira simples de fazer isso:
>
> import sys
> import time
> size = 50
> for i in range(size):
> sys.stdout.write("[%s%s]\r" % ('*' * i, ' ' * (size - i - 1)))
> sys.stdout.flush()
> time.sleep(.25)
>
> Os pontos principais do código são:
> - Use sys.stdout.write, ele não coloca o \n como o print faz, você
> pode utilizar print com vírgula no final também (python 2.x)
> - Dê um flush pro output ser atualizado
> - Use uma conta simples para imprimir espaços no meio da barra, assim
> seu colchetes fica lá no canto parado
>
> Abraços,
>
> --
> Danilo Cabello
> Bottom-poster maniac.
>

__._,_.___
.

__,_._,___

Nilton Volpato

unread,
Mar 11, 2011, 3:34:54 PM3/11/11
to python...@yahoogrupos.com.br
 

Tem também a essa biblioteca: http://code.google.com/p/python-progressbar/ que
já faz uma barra de progresso com várias outras features.

2011/3/11 victorjabur <victo...@gmail.com>

> ------------------------------------
>
> Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
> Links do Yahoo! Grupos
>
>
>

[As partes desta mensagem que não continham texto foram removidas]

__._,_.___
.

__,_._,___

Rômulo Machado

unread,
Mar 10, 2011, 8:18:01 PM3/10/11
to python...@yahoogrupos.com.br
 

Fiz dessa maneira, Victor:

"#!/usr/bin/env python
#-*- coding:utf-8 -*-

barra_comeco = '['
barra_fim = 9
for i in range(10):
print barra_comeco + '='*i + '>' + ' ' * barra_fim + ']' + str(i+1) + '
%'
barra_fim -= 1"

Ficou simples, não sei se foi assim que você pensou, mas tá aí!

ps.: Fiz até 10, mas se for isso mesmo é só mudar o índice pra 100!

Abraços



Em 10 de março de 2011 21:49, victorjabur <victo...@gmail.com> escreveu:

> Boa Noite galera,
>
> Estou querendo controlar o sys.stdout.write para fazer uma barrinha de
> progresso, tipo a do wget no shell, segue uma imagem abaixo:
>
> http://i55.tinypic.com/avo0tl.png
>
> Quero fazer o seguinte:
>
> Deixar 100 caracteres entre dois colchetes, por exemplo:
>
> [==========> ]
>
> Entre os dois colchetes tem 100 caracteres, o problema é que o segundo
> colchetes deve permanacer parado e no print sysout eu teria que deletar
> caracteres para obter este efeito.
>
> Alguém tem idéia disso ?
>
> Obrigado.
> Victor Jabur
>
>
>

> ------------------------------------
>
> Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
> Links do Yahoo! Grupos
>
>
>

--
Rômulo dos Santos Corrêa Machado
Linux User #509114
@romulo_machado_



[As partes desta mensagem que não continham texto foram removidas]

__._,_.___
Atividade nos últimos dias:
.

__,_._,___

Rafael

unread,
Mar 10, 2011, 9:23:21 PM3/10/11
to python...@yahoogrupos.com.br, victorjabur
 

2011/3/10 victorjabur <victo...@gmail.com>



> Estou querendo controlar o sys.stdout.write para fazer uma barrinha de
> progresso, tipo a do wget no shell, segue uma imagem abaixo:
>

O efeito é obtido usando o caracter '\r', ou "retorno de carro".
Quando "impresso" ele faz com que o cursor volte ao início da linha atual e,
assim,
permite que você escreva "por cima" do que já está escrito.
É análogo à máquina de escrever.

Escrevi um código de exemplo para que você possa testar:
http://paste.pocoo.org/show/351686/

-- Rafael Valverde



[As partes desta mensagem que não continham texto foram removidas]

__._,_.___
.

__,_._,___

Herson

unread,
Mar 10, 2011, 10:50:44 PM3/10/11
to python...@yahoogrupos.com.br
Tenta este
http://hersonls.com.br/blog/2010/11/11/barra-de-progresso-com-python-e-console/

--
Herson Leite, Desenvolvedor Web
www.hersonls.com.br | hers...@gmail.com


[As partes desta mensagem que não continham texto foram removidas]

------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html


Reply all
Reply to author
Forward
0 new messages