2010-08-27 4 views
0

I "essaie de faire une simple barre de progression de texte dans les fenêtres console et affiche également des caractères UTF8.Purger l'écran de la console avec contournement de classe unicode spéciale pour les fenêtres console

Le problème est pas que les caractères unicode gagné » Comment puis-je obtenir cette information? Flush() funcionality de retour dans la console et toujours utiliser cette classe 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') 

Répondre

1

Peut-être que vous devriez utiliser la méthode plus primitive d'utilisation de retour arrière pour supprimer le numéro précédent? Ou faire quelque chose comme:

def progress(num): 
    sys.stdout.write("\r"+20*" "+"\r"+str(num)+"% τοις εκατό...") 

Ecrasement avec des espaces après le retour et faire deuxième retour.

Je ne vois aucun clignotement lorsque je fais cela, cela ne fonctionne que pour moi lorsque j'exécute le code depuis la fenêtre de commande, et non en double-cliquant.

#<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') 
+0

Vous êtes génial! Merci. Travaillez, à merveille. De votre code, il semble que la partie importante est où vous itérez char (8) pour chaque caractère dans le texte de mise à jour de progrès avant chaque appel pour écrire une mise à jour sur le texte de progression. – russo

+0

Plus tard, j'ai pris conscience qu'il est probablement préférable d'ajouter sys.stdout.flush() à ce type de code. –

Questions connexes