我试图在Windows控制台中创建一个简单的文本进度条,并显示utf8字符。
问题不在于unicode字符不会显示,而是会显示。 这是为了使unicode字符显示我使用了一个类来告诉sys.stdout该做什么。这干扰了普通的flush()函数。
如何在控制台中恢复此flush()功能并仍使用此unicode类?
#coding=<utf8>
import sys, os
#make windows console unicode friendly
if sys.platform == "win32":
os.popen('chcp 65001')
class UniStream(object):
__slots__= "fileno", "softspace",
def __init__(self, fileobject):
self.fileno= fileobject.fileno()
self.softspace= False
def write(self, text):
if isinstance(text, unicode):
os.write(self.fileno, text.encode("utf_8"))
else:
os.write(self.fileno, text)
def flush(self):
self.flush()
sys.stdout = UniStream(sys.stdout)
sys.stderr = UniStream(sys.stderr)
def progress(num):
sys.stdout.write("\r"+str(num)+"% τοις εκατό...")
sys.stdout.flush()
for i in xrange(2000):
progress(i)
x = raw_input('done')
答案 0 :(得分:1)
也许您应该使用更原始的使用退格键来删除以前的数字? 或者做类似的事情:
def progress(num):
sys.stdout.write("\r"+20*" "+"\r"+str(num)+"% τοις εκατό...")
在返回后用空格覆盖并进行第二次返回。
当我这样做时,我没有看到任何闪烁,它只适用于从命令窗口运行代码而不是双击。
#<coding=<utf8>
import sys, os, time
clear, percent ='', -1
def progress(num, maxvalue):
global clear, percent
p = 100 * num / maxvalue +1
if p != percent:
percent = p
for c in clear: sys.stdout.write(chr(8))
clear = str(p)+"% τοις εκατό..."
sys.stdout.write(clear)
#make windows console unicode friendly
if sys.platform == "win32":
os.popen('chcp 65001')
class UniStream(object):
__slots__= "fileno", "softspace",
def __init__(self, fileobject):
self.fileno= fileobject.fileno()
self.softspace= False
def write(self, text):
if isinstance(text, unicode):
os.write(self.fileno, text.encode("utf_8"))
else:
os.write(self.fileno, text)
sys.stdout = UniStream(sys.stdout)
sys.stderr = UniStream(sys.stderr)
maxval=2000
for i in xrange(maxval):
progress(i,maxval)
time.sleep(0.02)
raw_input('done')