Очистите экран консоли специальным обходным решением класса Unicode для консоли Windows - PullRequest
0 голосов
/ 27 августа 2010

Я пытаюсь создать простой текстовый индикатор выполнения в консоли Windows, а также отображать символы utf8.

Проблема не в том, что символы Юникода не будут отображаться, они будут отображаться.для отображения символов юникода я использовал класс, чтобы сообщить 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')

1 Ответ

1 голос
/ 27 августа 2010

Может быть, вам следует использовать более примитивный метод использования backspace для удаления предыдущего числа? Или сделать что-то вроде:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...