Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Diagramme dans une boucle

+1 vote

Soit un diagramme en batons obtenu( avec matplotlib) qui s'affiche sans problème. Mettez ces lignes d'instructions à l'intérieur d'un While True (qui permet de faire une boucle infinie pouvant être interrompue par un input) et le programme se bloque. Pourquoi ?

demandé 7-Sep par Duareb

il faudrait un minimum de code pour illustrer le pb pour pouvoir aider

Plus de mémoire ? Mets voir un time.sleep(3) dans la boucle.

Difficile d'être sûr avec si peu de détails.

Il faut se souvenir que matplotlib.show() est bloquant.
Donc si tu fais show() dans la boucle pour voir le diagramme, c'est normal que le suivant n'apparaisse pas tant que le premier n'est pas fermé.

1 Réponse

0 votes

OK ! Voici le programme qui marche :

import matplotlib.pyplot as plt
def diag(donnees,etiquettes):
    nomb_barres=len(donnees)
    positions=range(1,nomb_barres+1)
    plt.barh(positions,donnees,align='center',color='red')

    plt.yticks(positions,etiquettes)
    plt.xlabel('Valeurs')
    plt.ylabel('Jours')
    plt.title('Résultats')
    plt.grid
    plt.show


i=10
pas=[i,i+20,i+30,i+40,i+50]
etiquettes=['lun','mar','mer','jeu','ven']
diag(pas,etiquettes)

et celui qui ne marche pas :

import matplotlib.pyplot as plt

def diag(donnees,etiquettes):
    nomb_barres=len(donnees)
    positions=range(1,nomb_barres+1)
    plt.barh(positions,donnees,align='center',color='red')

    plt.yticks(positions,etiquettes)
    plt.xlabel('Valeurs')
    plt.ylabel('Jours')
    plt.title('Résultats')
    plt.grid
    plt.show

i=20

while True:
    pas=[i,i+20,i+30,i+40,i+50]
    etiquettes=['lun','mar','mer','jeu','ven']
    diag(pas,etiquettes)

    i=eval(input("Une autre valeur non nulle pour i ? (Taper 0 pour arrêter):"))
    if i==0:
        break

print("Le programme est fini")

Remarque :Merci pour cette réponse;
Mon PC est assez puissant.
Non, hélas le time.sleep ne change rien. Ce qui est curieux, c'est qu'après le blocage (qui se traduit par par une fenêtre graphique vide dès la première boucle), si je sors de la boucle en tapant 0, le diagramme s'affiche correctement !

répondu 9-Sep par duareb
edité 9-Sep par bubulle

change les 2 dernières lignes de la fonction diag() par :

plt.grid()
plt.show()
...