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