2017-05-30 2 views
1

Je suis aux prises avec pyplot de la bibliothèque matlpotlib. La figure se fige déjà lorsque je tente de créer le terrain:Le graphique de pyplot se bloque (ne répond pas)

plt.figure() 
plt.ion() 
ax1 = plt.subplot(211) #Here it freezes 
plt.title('test', fontsize=8) 
plt.xlim(-1700, 1700) 
plt.ylabel('x-axis') 
plt.xlabel('y-axis') 
plt.grid() 
plt.show() 
...do something else 

Je n'ai travaillé avec des parcelles PyQt, mais cette fois je voudrais résoudre mon problème sans multithreading puisque je ne me soucie pas si l'intrigue arrête mon code pour un court instant. Le problème est que le script ne s'arrête pas mais continue à fonctionner et n'attend pas que la figure soit complètement créée. (time.sleep() n'aide pas). Y a-t-il une solution sans threads?

Cheers, James

Ps .: Si j'ajoute un point d'arrêt après le code et exécuter en mode débogage, il n'y a pas de problème (évidemment).

+0

Comment (où) exécutez-vous ceci? Il est évidemment difficile à reproduire car exécuter un script fonctionne très bien (dans le sens où un intrigue est créé, immédiatement fermé et «... faire autre chose» est exécuté). Ajouter plus de détails comme les versions, backend, procédure d'exécution exacte (ou IDE à partir de laquelle il est exécuté) est nécessaire. – ImportanceOfBeingErnest

+0

Donc j'utilise Pycharm 2016.2.3 avec Python 2.7 et honnêtement, je ne sais pas ce que l'on entend par backend. Pour souligner mon problème: Si je change "do sth else" en time.sleep (5) l'intrigue apparaît après 5 secondes. La même chose arrive avec mon code: La boucle de mesure suivante bloque le thread principal (unique) et donc pyplot ne peut pas co-compléter le tracé. Je cherche une sorte de feedback de l'intrigue, afin que le script ne continue que lorsque l'intrigue a été construite. –

Répondre

0

Est-ce que celui-ci fonctionne comme vous le voulez?

import matplotlib.pyplot as plt 

plt.figure() 
plt.ion() 
ax1 = plt.subplot(211) #Here it freezes 
plt.title('test', fontsize=8) 
plt.xlim(-1700, 1700) 
plt.ylabel('x-axis') 
plt.xlabel('y-axis') 
plt.grid() 
plt.draw() # draw the plot 
plt.pause(5) # show it for 5 seconds 
print("Hallo") # continue doing other stuff 
+0

Oui c'est le cas; Si j'ajoute time.sleep (5) après, l'intrigue se termine avant le timeout. Mais je suppose que si je veux garder l'intrigue dans tout mon code, je devrais passer au multithread ... Sinon, il se bloque toujours quand je clique accidentellement dessus. –

0

L'utilisation plt.clf est un addon simple à fermer la figure après la parcelle est terminée.

import matplotlib.pyplot as plt 

plt.figure() 
plt.ion() 
ax1 = plt.subplot(211) 
plt.title('test', fontsize=8) 
plt.xlim(-1700, 1700) 
plt.ylabel('x-axis') 
plt.xlabel('y-axis') 
plt.grid() 
plt.show() 
plt.clf() # Here is another path