Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

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

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

Online MKe

  • Lid
  • Steunpunt: Nee
[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/

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
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 »

Online MKe

  • Lid
  • Steunpunt: Nee
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.

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
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 »

Online MKe

  • Lid
  • Steunpunt: Nee
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/