I have always wondered how people update a previous line in a command line. a great example of this is when using the wget command in linux. It creates an ASCII loading bar of sorts that looks like this:
[======> ] 37%
and of course the loading bar moves and the percent changes, But it doesn't make a new line. I cannot figure out how to do this. Can someone point me in the right direction?
The command line, also called the Windows command line, command screen, or text interface, is a user interface that's navigated by typing commands at prompts, instead of using a mouse. For example, the Windows folder in a Windows command line is "C:\Windows>" (as shown in the picture).
One way to do this is to repeatedly update the line of text with the current progress. For example:
def status(percent): sys.stdout.write("%3d%%\r" % percent) sys.stdout.flush()
Note that I used sys.stdout.write
instead of print
(this is Python) because print
automatically prints "\r\n" (carriage-return new-line) at the end of each line. I just want the carriage-return which returns the cursor to the start of the line. Also, the flush()
is necessary because by default, sys.stdout
only flushes its output after a newline (or after its buffer gets full).
There are two ways I know of to do this:
curses
package, if your programming language of choice has bindings for it.And a Google revealed ANSI Escape Codes, which appear to be a good way. For reference, here is a function in C++ to do this:
void DrawProgressBar(int len, double percent) { cout << "\x1B[2K"; // Erase the entire current line. cout << "\x1B[0E"; // Move to the beginning of the current line. string progress; for (int i = 0; i < len; ++i) { if (i < static_cast<int>(len * percent)) { progress += "="; } else { progress += " "; } } cout << "[" << progress << "] " << (static_cast<int>(100 * percent)) << "%"; flush(cout); // Required. }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With