|
THeK3nger
|
 |
« 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
|
|
|
|
Wolf
moderatore
python sapiens sapiens
Scollegato
Messaggi: 1003
|
 |
« 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
|
 |
« 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
|
 |
« 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
|
|
|
|
|
crap0101
|
 |
« 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
Messaggi: 1003
|
 |
« Risposta #5 inserito:: Agosto 12, 2008, 23:52 » |
|
Oppure fai una bella barra di caricamento tipo: 0% 50% 100% |============|========
|
|
|
|
|
Registrato
|
|
|
|
|
crap0101
|
 |
« 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
Messaggi: 430
|
 |
« 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
Messaggi: 430
|
 |
« 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: 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
|
 |
« 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. 
|
|
|
|
|
Registrato
|
|
|
|
|
checkm
|
 |
« 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
|
 |
« Risposta #11 inserito:: Settembre 12, 2008, 19:56 » |
|
AH! bello, soprattutto quello con la percentuale potrebbe tornarmi utile 
|
|
|
|
|
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
|
 |
« Risposta #12 inserito:: Settembre 13, 2008, 11:07 » |
|
@checkm
Davvero molto utili!! Grazie.
|
|
|
|
|
Registrato
|
|
|
|
|