Python-it.org forum # share your knowledge! ;)
Febbraio 09, 2010, 07:43 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizie: sponsorizzazione e partecipazione a PyCon Italia 4: http://www.python-it.org/forum/index.php?topic=3511.msg28939#msg28939
 
   Home   Guida Regolamento Ricerca Accedi Registrati Python-it.org Doc  
Apri il forum in una pagina a parte - È possibile fornire/richiedere supporto anche presso i canali IRC #python su Azzurra e #python.it su Freenode

Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Sovrascrivere una riga da terminale  (Letto 655 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
THeK3nger
python erectus
***
Scollegato Scollegato

Messaggi: 192


Mad Scientist


Mostra profilo WWW
« inserito:: Agosto 12, 2008, 15:56 »

Come potrei fare se volessi scrivere sovrascrivere una riga del terminale.

Per esempio ho un programma che scrive:

"operazione eseguita al X%"

e vorrei che quando scrive "operazione eseguita all'Y%" non lo scrive sotto bensì sovrascrive l'ultima frase scritta.

Con il C conoscevo un uso speciale di printf che lo faceva ma in python?
Registrato

Ho bisogno di prendermi una vacanza.
http://slashcode.wordpress.com -- my project home...
Wolf
moderatore
python sapiens sapiens
*
Scollegato Scollegato

Messaggi: 1003



Mostra profilo WWW
« Risposta #1 inserito:: Agosto 12, 2008, 19:58 »

Puoi usare '\b' per spostare indietro il cursorse di una posizione in modo che il nuovo testo che aggiungi sovrascriva il precedente.
Registrato
crap0101
python sapiens
*****
Scollegato Scollegato

Messaggi: 660


Long Live The New Flesh


Mostra profilo WWW
« Risposta #2 inserito:: Agosto 12, 2008, 21:52 »

oppure le curses, se non è eccessivo per il tipo di programma
Registrato

- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
THeK3nger
python erectus
***
Scollegato Scollegato

Messaggi: 192


Mad Scientist


Mostra profilo WWW
« Risposta #3 inserito:: Agosto 12, 2008, 22:20 »

Puoi usare '\b' per spostare indietro il cursorse di una posizione in modo che il nuovo testo che aggiungi sovrascriva il precedente.

mmm... un " print '\b'*10 " torna indietro di 10 caratteri giusto?

oppure le curses, se non è eccessivo per il tipo di programma

Effettivamente per il momento mi pare troppo. Ma me le sengo nel caso dovessi fare roba più complessa.
Registrato

Ho bisogno di prendermi una vacanza.
http://slashcode.wordpress.com -- my project home...
crap0101
python sapiens
*****
Scollegato Scollegato

Messaggi: 660


Long Live The New Flesh


Mostra profilo WWW
« Risposta #4 inserito:: Agosto 12, 2008, 23:49 »

sì, tipo così:
for i in range(10000000): print i, '\b'*10,   # o str(i) + '\b'*10
solo che, se devi fare come hai scritto, (un contatore di percentuale o anche un contatore di tempo), forse è proprio meglio che usi le curses, ma solo per un fatto estetico. Se provi a lanciare quelle due righe che ho scritto sopra, noterai che si vede il cursore fare avanti e indietro freneticamente (almeno, sul mio terminale lo vedo così)
Registrato

- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Wolf
moderatore
python sapiens sapiens
*
Scollegato Scollegato

Messaggi: 1003



Mostra profilo WWW
« Risposta #5 inserito:: Agosto 12, 2008, 23:52 »

Oppure fai una bella barra di caricamento tipo:
Codice:
0%          50%            100%
|============|========
Registrato
crap0101
python sapiens
*****
Scollegato Scollegato

Messaggi: 660


Long Live The New Flesh


Mostra profilo WWW
« Risposta #6 inserito:: Agosto 13, 2008, 00:02 »

una domanda un pò OT:

mentre provavo a stampare con '\b' stavo usando time.sleep()
ebbè, notavo che se si scrive
print "numero"
sleep(1)
tutto ok,
invece se si scrive
print "numero",
sleep(1)
mettendo la virgola non viene stampato niente fino alla fine. Non sarebbe meglio che printasse  se il comando successivo è uno non-print? o ci sono delle ragioni particolari?
Registrato

- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
manzo
moderatore
python neanderthalensis
*
Scollegato Scollegato

Messaggi: 430



Mostra profilo WWW
« Risposta #7 inserito:: Agosto 13, 2008, 07:53 »

Puoi usare '\b' per spostare indietro il cursorse di una posizione in modo che il nuovo testo che aggiungi sovrascriva il precedente.
oppure \r per tornare direttamente all'inizio di una riga:
>>> print "abbasso\r python"
 python
Registrato

#!/usr/bin/env python
(you,love,me)=('Madein zAr','0-*1+).()-/,-,',len('.signature')<<1)
print ''.join([you[give-me] for give in [ord(er)-me for er in love]])
manzo
moderatore
python neanderthalensis
*
Scollegato Scollegato

Messaggi: 430



Mostra profilo WWW
« Risposta #8 inserito:: Agosto 13, 2008, 07:58 »

una domanda un pò OT:
mettendo la virgola non viene stampato niente fino alla fine. Non sarebbe meglio che printasse  se il comando successivo è uno non-print? o ci sono delle ragioni particolari?
in generale il device di ouput (stdout) è bufferizzato, la scrittura effettiva a video avviene ad ogni fine riga \n (implicito se non metti la virgola) oppure se esplicitamente fai un flush:
Codice:
sys.stdout.flush()
Registrato

#!/usr/bin/env python
(you,love,me)=('Madein zAr','0-*1+).()-/,-,',len('.signature')<<1)
print ''.join([you[give-me] for give in [ord(er)-me for er in love]])
THeK3nger
python erectus
***
Scollegato Scollegato

Messaggi: 192


Mad Scientist


Mostra profilo WWW
« Risposta #9 inserito:: Agosto 13, 2008, 10:26 »

Grazie a tutti. Per il momento ho usato 'r' seguito da uno sleep di un secondo (ho un thread che si occupa solo di disegnare la barra) quindi il cursore avanti e dietro non si nota tantissimo. smile
Registrato

Ho bisogno di prendermi una vacanza.
http://slashcode.wordpress.com -- my project home...
checkm
python habilis
**
Scollegato Scollegato

Messaggi: 54



Mostra profilo WWW
« Risposta #10 inserito:: Settembre 12, 2008, 08:29 »

So che il post risulta vecchio ma io ho le mia suluzioni che ho usato per alcuni scriptini. :-)

La prima, la classica barretta roteante :-) :
load = "| \ - /"

while 1:
    for x in load:
        sys.stdout.write("\r%s" % x)
        time.sleep(0.05)
        sys.stdout.flush()

Oppure (con la percentuale):
for x in range(100):
    sys.stdout.write("\r%s%% Complete" % x)
    time.sleep(0.5)
    sys.stdout.flush()

O ancora con la barra di caricamento:
bar = ""

for x in range(100):
    sys.stdout.write("\r%s -> %s%%" % (bar, x))
    time.sleep(0.5)
    sys.stdout.flush()
    bar = bar + "="

Spero possa ancora essere utile a qualcuno
« Ultima modifica: Settembre 12, 2008, 08:38 da checkm » Registrato

crap0101
python sapiens
*****
Scollegato Scollegato

Messaggi: 660


Long Live The New Flesh


Mostra profilo WWW
« Risposta #11 inserito:: Settembre 12, 2008, 19:56 »

AH! bello, soprattutto quello con la percentuale potrebbe tornarmi utile  smile
Registrato

- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Emanuele
python erectus
***
Scollegato Scollegato

Messaggi: 163


Mostra profilo
« Risposta #12 inserito:: Settembre 13, 2008, 11:07 »

@checkm

Davvero molto utili!!
Grazie.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC XHTML 1.0 valido! CSS valido!