curses and refreshing problem

Carl Banks pavlovevidence at gmail.com
Sun Dec 14 00:15:17 EST 2008


On Dec 13, 2:29 pm, Karlo Lozovina <_karlo_ at _mosor.net_> wrote:
> Hi, I'm trying to implement text output interface, something similar to
> wget, using curses module. There are just two things I can't find out how
> to do: prevent curses from clearing the terminal when starting my program,
> and leaving my output after the program closes. Any way to do this with
> curses?

Unless you are referring to some wget screen mode I don't know about,
I suspect wget outputs its progress bar using carriage returns without
newlines.  If that's all you want, there is no need to use curses.

Here is a little example program to illustrate:

import time, sys
for i in range(21):
    sys.stdout.write('\rProgress: [' + '='*i + ' '*(20-i) + ']')
    sys.stdout.flush()
    time.sleep(1)
sys.stdout.write("\nFinised!\n")


Notice I'm using sys.stdout.write instead of print, because print
automatically appends a newline (which we don't want here).  Yes you
can suppress the newline on print by using a trailing comma, but that
creates an undesirable artifact--a leading space--on the following
cycle.

Notice the '\r' at the beginning of the sys.stdout.write call.  This
tells the terminal to move the cursor back to the beginning of the
line, whence it draws the new progress bar over the old progress bar.

And finally, notice the call to sys.stdout.flush().  When a program is
run on a terminal the underlying I/O is usually line-buffered, meaning
that nothing actually gets output until a newline character is sent.
Therefore we have to call sys.stdout.flush() to flush the buffer
manually.


Carl Banks



More information about the Python-list mailing list