kmecpp
kmecpp

Reputation: 2489

Print over Current Line in Python Shell

I'm trying to make a percentage text that displays a progress amount but i'm trying to avoid the percentages printing out like this:

Progress: 10% Progress: 11% Progress: 12% Progress: 13%

How can erase and write over the current line? Iv'e tried using the \r and \b characters but neither seems to work. Every single thing I found before has been for either for Python 2 or Unix so i'm not even sure which of those is the problem (if even one of them) because i'm not using either. Does anyone know how I can do this with Python 3 running Windows 7? This is the unworking code that I have currently, but I've tried plenty of other things.

print('Progress: {}%'.format(solutions//possibleSolutions),flush=True,end="\r")

EDIT:

This is not a problem if I'm executing the program from command prompt so I don't think it is a problem with windows. I tried updating Python from what i was using previously (3.4.1) to the latest v3.4.3 and the issue is the same.

Heres a screenshot of the problem: This is the best I can do at taking a screenshot of the issue. It appears as if each time I move the cursor farther to the left (passed one of the Progress:'s) that the gray area between the text and the cursor gets larger

EDIT 2: The problem is that IDLE does not support ASCII control codes. Solution: Use a different IDE.

Upvotes: 2

Views: 1058

Answers (4)

Florian Lalande
Florian Lalande

Reputation: 639

Use the character '\r' for the print function. Default is '\n'.

'\r' stands for carriage return, '\n' means new line.

Upvotes: 0

szachy-a
szachy-a

Reputation: 21

You can't use '\r' and '\b' in IDLE. If you want to use it, try adding these lines at the start of your program:

import sys
sys.stdout = sys.__stdout__

and running idle with this batch script:

@echo off
echo Running IDLE...
py -m idlelib

then, you see output in cmd window and there are '\r' and '\b'.

Upvotes: 0

Padraic Cunningham
Padraic Cunningham

Reputation: 180481

You can use print:

print('Progress: {}%'.format(solutions),flush=True,end="\r")

Upvotes: 4

tomasyany
tomasyany

Reputation: 1242

You can create a new class called Printer like this:

class Printer():
    def __init__(self, data):
        sys.stdout.write("\r\x1b[K"+data.__str__())
        sys.stdout.flush()

Then, let's say you want to print the progress of a for loop:

for i in range(0, 100):
        p = i * 100
        output = "%d%% of the for loop completed" % p
        Printer(output)

Upvotes: -1

Related Questions