2009-08-21 7 views
1

J'ai un script qui utilise un simple en boucle pour afficher une barre de progression, mais il ne semble pas fonctionner comme je m'y attendais:Aide avec Python tandis que le comportement de la boucle

count = 1 
maxrecords = len(international) 
p = ProgressBar("Blue") 
t = time 
while count < maxrecords: 
    print 'Processing %d of %d' % (count, maxrecords) 
    percent = float(count)/float(maxrecords) * 100 
    p.render(int(percent)) 
    t.sleep(0.5) 
    count += 1 

Il semble en boucle à "p.render ..." et ne retourne pas à "print" Traitement% d de% d ... '".

MISE À JOUR: Mes excuses. Il semble que ProgressBar.render() supprime la sortie de "print" Processing ... "quand il rend la barre de progression. La barre de progression est de http://nadiana.com/animated-terminal-progress-bar-in-python

+0

Voulez-vous dire la valeur de comptage ne change pas? –

Répondre

2

Quelle est la mise en œuvre ProgressBar.render()? Je suppose qu'il sort des caractères de contrôle de terminal qui déplacent le curseur afin que la sortie précédente soit écrasée. Cela peut créer la fausse impression que le flux de contrôle ne fonctionne pas comme il se doit.

+0

Voici la ouput: Traitement 1 de 17909 0% 0% 0% 0% 0% 0% 0% – Francis

+1

Le ProgressBar est de http://nadiana.com/animated-terminal-progress-bar-in-python – Francis

3

Ce n'est pas la manière d'écrire une boucle en Python.

maxrecords = len(international) 
p = ProgressBar("Blue") 
for count in range(1, maxrecords): 
    print 'Processing %d of %d' % (count, maxrecords) 
    percent = float(count)/float(maxrecords) * 100 
    p.render(int(percent)) 
    time.sleep(0.5) 

Si vous voulez vraiment faire quelque chose avec le dossier, plutôt que de simplement rendre la barre, vous feriez ceci:

maxrecords = len(international) 
for count, record in enumerate(international): 
    print 'Processing %d of %d' % (count, maxrecords) 
    percent = float(count)/float(maxrecords) * 100 
    p.render(int(percent)) 
    process_record(record) # or whatever the function is 
+1

Les utilisateurs ne seront pas satisfaits de "Processing 0 of 100" :-) –

+0

Merci pour la réponse rapide. J'ai essayé votre première suggestion, elle ne revient toujours pas à la ligne "print 'Processing ...". Il est coincé à la ligne "p.render ...". – Francis

+1

Il n'est pas "coincé" @Francis. Veuillez fournir le reste du code dans votre question. –

5

Je vois que vous utilisez l'implémentation ProgressBar sur mon site Web. Si vous souhaitez imprimer un message, vous pouvez utiliser l'argument de message rendu

p.render(percent, message='Processing %d of %d' % (count, maxrecords)) 
+1

Merci pour le ProgressBar;) – Francis

+1

S'il vous plaît laissez-moi savoir si vous trouvez un bug. Je serai plus qu'heureux de le réparer. –

+0

Fonctionne parfaitement. Merci pour le conseil! – Francis

1

(1) [ne fait pas partie du problème, mais ...] t = time suivi beaucoup plus tard par t.sleep(0.5) serait une source d'agacement pour Quelqu'un qui voit le t nu et avoir à lire à l'envers pour trouver ce que c'est.

(2) [ne fait pas partie du problème, mais ...] count ne peut jamais entrer la boucle avec la même valeur que maxrecords. Par exemple. si maxrecords est 10, le code dans la boucle n'est éxécuté que 9 fois.

(3) Il n'y a rien dans le code que vous avez montré qui supporterait l'idée qu'il est "en boucle à p.render()" - à moins que la méthode de rendu elle-même boucle si son arg est zéro, qui sera le cas si maxrecords est 17909. Essayez de remplacer le p.render (....) temporairement (par exemple)

print "pretend-render: pct =", int(percent)

+0

Merci pour les commentaires. Je comprends votre point re: # 2. En effet, la boucle ne traite pas jusqu'à 'maxrecords' - c'est toujours moins de 1 – Francis

Questions connexes