Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiline progress bars

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?

like image 757
yodie Avatar asked Nov 13 '09 04:11

yodie


2 Answers

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

like image 81
aaren Avatar answered Oct 23 '22 09:10

aaren


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");.

like image 44
mip Avatar answered Oct 23 '22 10:10

mip