Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [opgelost]Python printteller met meerdere regels  (gelezen 909 keer)

Offline MKe

  • Lid
[opgelost]Python printteller met meerdere regels
« Gepost op: 2011/12/05, 13:54:17 »
Hoi,

Als je een teller voor je script wilt maken die niet steeds eronder print, maar de vorige waarde steeds overschijft is dit heel eenvoudig:
import time
import sys
for i in range(10):
    time.sleep(1)
    print '\rteller %d' % i,
    sys.stdout.flush()
Dit zal bij elke iteratie de vorige waarde keurig overschijven in de shell zonder dat je een lange lijst van opeenvolgende iteraties krijgt.

Maar wat nu als je output een newline bevat? Dan werkt bovenstaande niet. Dus:
import time
import sys
for i in range(10):
    time.sleep(1)
    print '\rteller %d\nVorige waarde %d' % (i,i-1),
    sys.stdout.flush()
Werkt dus niet.

Weet iemand een methode om dit toch voor elkaar te krijgen?

p.s. eigenlijk wil ik een voortgangs teller maken voor een multi-threaded scriptje, waarbij elke thread een eigen regel heeft met een teller.

« Laatst bewerkt op: 2011/12/05, 16:24:17 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Re: Python print voortgang van verschillende regels
« Reactie #1 Gepost op: 2011/12/05, 14:16:44 »
Heel flauw: met 2 printregels.

- edit: laat maar, dan gaat de tekst ook scrollen -

Als je echter wat meer controle wil over waar teksten op het scherm komen in de terminal loont het misschien om eens naar ncurses te kijken. http://docs.python.org/library/curses.html

Voorbeeldje met curses:
#!/usr/bin/env python
import time
import curses
scr = curses.initscr()
#scr.refresh()
for i in range(5):
time.sleep(1)
scr.erase()
scr.addstr(1,1,"nummertje: %d"%i)
scr.addstr(2,1,"vorige nummertje: %d"%(i-1))
scr.refresh()
scr.addstr(3,1,"-klaar- druk op een toets om te verlaten.")
scr.getch()
curses.endwin()
« Laatst bewerkt op: 2011/12/05, 14:30:44 door erik1984 »

Offline MKe

  • Lid
Re: Python printteller met meerdere regels
« Reactie #2 Gepost op: 2011/12/05, 14:42:04 »
Dank je, dat werkt. Maar het lijkt wel gevaarlijk, als ik het scriptje halverwege afkap is mijn terminal volledig in de war.

Re: Python printteller met meerdere regels
« Reactie #3 Gepost op: 2011/12/05, 14:54:21 »
Nou ja gevaarlijk, maar je hebt wel gelijk. Als endwin() niet wordt aangeroepen is de terminal in de war. Gelukkig heeft python daarvoor een wrapper aan boord. Stelt wel andere kleuren in maar dat kun je denk ik wel aanpassen door zelf kleurenparen aan te maken en color_pair(0) overschrijven. Heb die wrapper-functie ook nog maar net ontdekt bij het doorkijken van de documentatie.

#!/usr/bin/env python
import time
import curses

def main(scr):
curses.use_default_colors()
for i in range(5):
time.sleep(1)
scr.erase()
scr.addstr(1,1,"nummertje: %d"%i)
scr.addstr(2,1,"vorige nummertje: %d"%(i-1))
scr.refresh()
scr.addstr(3,1,"-klaar- druk op een toets om te verlaten.")
scr.getch()

curses.wrapper(main)

edit: nu met standaardkleuren.
« Laatst bewerkt op: 2011/12/05, 16:11:42 door erik1984 »

Offline MKe

  • Lid
Re: Python printteller met meerdere regels
« Reactie #4 Gepost op: 2011/12/05, 16:23:35 »
Briljant, hartelijk dank!
« Laatst bewerkt op: 2011/12/05, 18:37:15 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/