6

I know that to update something like a progress bar on the command line, one uses '\r'. Is there any way to update multiple lines?

yodie
  • 431
  • 5
  • 14

4 Answers4

5

If you're using Python try using blessings. It's a really intuitive wrapper around curses.

Simple example:

from blessings import Terminal

term = Terminal()

with term.location(0, 10):
    print("Text on line 10")
with term.location(0, 11):
    print("Text on line 11")

If you're actually trying to implement a progress bar, consider using progressbar. It will save you a lot of \r cruft.

You can actually connect blessings and progressbar together. Try running this:

import time

from blessings import Terminal
from progressbar import ProgressBar

term = Terminal()

class Writer(object):
    """Create an object with a write method that writes to a
    specific place on the screen, defined at instantiation.

    This is the glue between blessings and progressbar.
    """
    def __init__(self, location):
        """
        Input: location - tuple of ints (x, y), the position
                        of the bar in the terminal
        """
        self.location = location

    def write(self, string):
        with term.location(*self.location):
            print(string)


writer1 = Writer((0, 10))
writer2 = Writer((0, 20))

pbar1 = ProgressBar(fd=writer1)
pbar2 = ProgressBar(fd=writer2)

pbar1.start()
pbar2.start()

for i in range(100):
    pbar1.update(i)
    pbar2.update(i)
    time.sleep(0.02)

pbar1.finish()
pbar2.finish()

multiline-progress

aaren
  • 5,325
  • 6
  • 29
  • 24
  • This is perfect! Small update: the current version of `progressbar` wants the file handle to have a `flush()` method too. – lenz Nov 05 '18 at 00:50
3

The best way is to use some existing library like ncurses. But you may try dirty workaround by clearing console with system call: system("cls");.

mip
  • 8,355
  • 6
  • 53
  • 72
2

You can use VT100 codes to reposition the cursor on a higher line, then overdraw it with your updated status.

bdonlan
  • 224,562
  • 31
  • 268
  • 324
  • The link is broken. Here's web archive's version: http://web.archive.org/web/20110103061220/http://web.eecs.utk.edu/~shuford/terminal/vt100_codes_news.txt – Sebastian Jan 20 '22 at 14:22
0

The Curses library offers powerful control for console UIs.

Suppressingfire
  • 3,246
  • 23
  • 17