Multiline progress bars

2019-04-08 20:26发布

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?

4条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-04-08 20:46

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

查看更多
三岁会撩人
3楼-- · 2019-04-08 20:47

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

查看更多
爷的心禁止访问
4楼-- · 2019-04-08 21:00

The Curses library offers powerful control for console UIs.

查看更多
Deceive 欺骗
5楼-- · 2019-04-08 21:01

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

查看更多
登录 后发表回答