Carriage Return Problem with Python on Windows

Larry Bates lbates at swamisoft.com
Fri Sep 3 10:20:54 EDT 2004


Here is a sample progress indicator class that should
(I think) answer your questions:

class progressbarClass:
    def __init__(self, finalcount, progresschar=None):
        import sys
        self.finalcount=finalcount
        self.blockcount=0
        #
        # See if caller passed me a character to use on the
        # progress bar (like "*").  If not use the block
        # character that makes it look like a real progress
        # bar.
        #
        if not progresschar: self.block=chr(178)
        else:                self.block=progresschar
        #
        # Get pointer to sys.stdout so I can use the write/flush
        # methods to display the progress bar.
        #
        self.f=sys.stdout
        #
        # If the final count is zero, don't start the progress gauge
        #
        if not self.finalcount : return
        self.f.write('\n------------------ %
Progress -------------------1\n')
        self.f.write('    1    2    3    4    5    6    7    8    9    0\n')
        self.f.write('----0----0----0----0----0----0----0----0----0----0\n')
        return

    def progress(self, count):
        #
        # Make sure I don't try to go off the end (e.g. >100%)
        #
        count=min(count, self.finalcount)
        #
        # If finalcount is zero, I'm done
        #
        if self.finalcount:
            percentcomplete=int(round(100*count/self.finalcount))
            if percentcomplete < 1: percentcomplete=1
        else:
            percentcomplete=100

        #print "percentcomplete=",percentcomplete
        blockcount=int(percentcomplete/2)
        #print "blockcount=",blockcount
        if blockcount > self.blockcount:
            for i in range(self.blockcount,blockcount):
                self.f.write(self.block)
                self.f.flush()

        if percentcomplete == 100: self.f.write("\n")
        self.blockcount=blockcount
        return

if __name__ == "__main__":
    from time import sleep
    pb=progressbarClass(8,"*")
    count=0
    while count<9:
        count+=1
        pb.progress(count)
        sleep(0.2)

    pb=progressbarClass(100)
    pb.progress(20)
    sleep(0.2)
    pb.progress(47)
    sleep(0.2)
    pb.progress(90)
    sleep(0.2)
    pb.progress(100)
    print "testing 1:"
    pb=progressbarClass(1)
    pb.progress(1)


"Canes_Rock" <hinnc at yahoo.com> wrote in message
news:48593215.0409021155.69139a18 at posting.google.com...
> The information posted at:
>
>
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&threadm=slrnarv28n.e4j.TuxTrax%40fortress.tuxnet&rnum=1&prev=/groups%3Fq%3Dsuppress%2Bcarriage%2Breturn%2Bgroup:comp.lang.python.*%26hl%3Den%26lr%3D%26ie%3DUTF-8%26group%3Dcomp.lang.python.*%26selm%3Dslrnarv28n.e4j.TuxTrax%2540fortress.tuxnet%26rnum%3D1
>
> seemed to provide a solution to eliminating the line feed and causing
> a carriage return for the text displayed in the IDLE window, (I want
> to be able to overwrite displayed text - that is, eliminating the line
> feed from occuring and causing a carriage return).
>
> The comma at the end of the print command appeared to have eliminated
> the line feed, (\n), but the carriage return, (\r) does not work.  For
> example, (logic borrowed from previously referenced thread):
>
> for i in range(10) : print '\r' + `i`,
>
> This produces a small square box before each number, (sorry - can't
> duplicate the small square box here in this posting but if you were to
> substitute X for box the output would look like this):
>
> X1 X2 X3 X4 X5 X6 X7 X8 X9
>
> as you can see the line feed has been eliminated but the carriage
> return is not functioning as I would expect, (yes - its always about
> me isn't it?).
>
> I also tried a variation using sys.stdout.write and sys.stdout.flush
> but the root cause is the issue with the carriage return.
>
> Am I screwed or is there a way around this?  I am running Windows XP
> Home Edition using Python version 2.3.3 and IDLE version 1.0.2
>
> Any help would be appreciated!
>
> Thanks...





More information about the Python-list mailing list