Re printing on same line.
James T. Dennis
jadestar at idiom.com
Wed Jun 20 02:18:41 CEST 2007
Robert Bauck Hamar <roberth+news at ifi.uio.no> wrote:
> Jerry Hill wrote:
>> On 6/15/07, HMS Surprise <john at datavoiceint.com> wrote:
>>> I want to print a count down timer on the same line. I tried
>>> print '\r', timeLeft,
>>> which just appends to the same line.
>> Sounds to me like whatever you're printing to doesn't do what you
>> expect when it encounters a carriage return (\r). Is your program
>> running in a terminal? Both the windows cmd.exe shell and bash under
>> linux seem to do the right thing when encountering a '\r'.
> Actually, bash has nothing to do with how the terminal handles \r. The job
> of the shell (bash, ksh, csh, sh ...) is to execute your script when you
> type its name.
> Outputting a \r might or might not move the cursor to the beginning of the
> line. It's completely system specific, and even on the same OS, it depends
> on the capabilities of the actual terminal the programs run on, and on some
> terminal emulators it might depend on configuration settings.
> If you need to explore the capabilities of the terminal, curses will be a
> good place to start.
Sometimes you don't want to full curses mode switch and other baggage.
You can use the 'tput' utility to get the terminal escape sequences
for various cursor movements for your terminal. Read the tput man
page for some information, and the terminfo(5) man page for more.
In particular you can do things like (from a shell prompt):
tput sc; tput cup 0 30;echo Front and Center; tput rc
... which saves the current cursor location (sc), executes a cursor
position to the first line, 30th column (cup 0 30), writes some text
there, and then restores the cursor location (rc).
The trick, in Python, is that you can read these sequences into
your program via popen() calls and then print them wherever you
want to use them. You can even set colors (foreground and background),
and text attributes (dim, bright, blinking, underline) and perform
various other curses like applications without actually doing the
curses mode changes if you're really a bit masochistic.
However, for the original poster's purposes the easiest option would
probably be to print something like:
print chr(0x08) * 80, "new line stuff" + " " * 66
(Print lots of backspaces followed by whatever information you wanted to
over-write the line with and padding with enough spaces to clear any
other stuff you wanted to over-write).
Yes, this is sloppy. Yes, it might not work on some terminals or under
some terminal settings. However, it should work under most circumstances
on most terminals --- including some which wouldn't support the curses
module. You can improve it somewhat by keeping track of how many
characters you've printed to the current (last) line and dynamically
printing the precise number of backspaces and padding spaces that are
Starshine: Signed, Sealed, Delivered
More information about the Python-list