J'essaie pendant des heures pour obtenir ce script simple fonctionner, mais rien que je ne semble aider. Il s'agit d'une légère modification du code d'échantillon de tracé animé le plus élémentaire du site Web Matplotlib, qui devrait simplement montrer quelques cadres de bruit (j'ai le même problème avec le code non modifié de leur site Web BTW).
sur mon ordinateur avec le Tkagg Backend Je reçois environ 20 cadres (sur 60) avant la geler la fenêtre de la parcelle. Avec Qt4agg, je viens de recevoir une fenêtre congelée, noire et aucun encadrement n'est tracés. J'ai essayé de multiples combinaisons de versions numpy, pyqt, python et matplotlib différentes, mais obtenez toujours le même résultat. P>
S'il vous plaît laissez-moi savoir si cela fonctionne pour vous ou si quelque chose a l'air faux. Je suis à peu près sûr que cela fonctionnait dans le passé, alors je pense que cela peut être une question de Windows ou quelque chose lié à fyi j'utilise Windows 7 (32 bits) et j'ai testé avec Python 2.6 / 2.7, MPL 1.0.0 / 0.9.9.8, PYQT 4.6 / 4.7, NUMPY 1.4 / 1.5B. P> ion () code>. P>
from pylab import *
ion()
hold(False)
for i in range(40):
plot(randn(10))
draw()
show()
8 Réponses :
Lorsque vous dites des geles après les premiers cadres, vous voulez dire 2 ou 3, ou dire, 40 ou 60, comme ce sont les limites supérieures de votre boucle?
Si vous voulez que l'animation continue indéfiniment, vous avez besoin quelque chose comme p> mais vous devrez forcer à arrêter votre programme. p> p>
En règle générale, il gèle après environ 20 images et la fenêtre de parcelle indique «ne pas répondre», bien que le script continue à courir et à imprimer les numéros de cadre.
Cet exemple fonctionne-t-il? Matplotlib.sourceforge.net/examples/animation/...
Je n'ai pas de pygtk, mais matplotlib.sourceforge.net/examples/animation/... < / a> donne le même problème - cela fonctionne pendant un moment, puis gèle.
Est-ce que ça gèle ou finit? Sur la même empreinte que print 'fps:' ... code> et avant d'ajouter
AX.Plot (plage (10)); fig.canvas.draw () code> - si vous Obtenez une belle ligne droite de <0,0> à <9,9>, ce n'est pas gel.
Les animations fonctionnent pendant un moment, gèle environ à mi-chemin pendant environ 10 ans (c'est ce que je vois: i. imgur.com/p4i7c.png ), alors il dépasse et je vois la trame finale, ainsi que la ligne droite.
Typiquement, les cadres d'interface graphique doivent «propager» la boucle principale du programme. Assis dans une boucle serrée avec dormir pour retarder les itérations «casserez» les applications d'interface graphique (votre problème est conforme à une brise typique dans ces lignes). Il est possible que les devs MATPLOLIB aient implémenté certains dans les coulisses de la logique des scènes pour que ces verrouillages se produisent de certaines butines à outils, mais la restructuration de votre programme devrait légèrement éliminer toutes les chances de la propriété principale étant le problème (qui est em> très probable em> pense). Le matplotlib Animation Wiki suggère également d'utiliser des boucles d'événement indigènes pour tout ce qui est non provisoire (probablement Pour cette raison)
plutôt que de rester assis dans une boucle avec dort, je vous suggère que, à la place, vous utilisez la boîte à outils de l'interface graphique pour planifier une application après un certain délai. P>
def update_function(): # do frame calculation here refresh_timer = QtCore.QTimer() QtCore.QObject.connect( refresh_timer, QtCore.SIGNAL('timeout()'), update_function ) refresh_timer.start( 1.0 / 30 ) # have update_function called at 30Hz
Je suis peut-être en effet besoin de faire cela lorsque mon script est plus impliqué, mais je ne m'attendrais pas à ce que mon exemple simple (trivial presque) ait besoin de quelque chose de plus compliqué, en particulier depuis que je me souviens de ce travail dans le passé.
Que cela a fonctionné dans le passé peut avoir été plus un accident que toute autre chose. Toutes les outils à outils d'interface graphique courantes sont intrinsèquement asynchrones et tentent de les utiliser de manière synchrone constituent une faille de conception définie. Les utiliser de manière asynchrone peuvent toujours rester très simples, mais cela ne ressemble tout à fait que les développeurs de matplotlib ne les ont mis d'effort ... probablement due à l'animation étant un cas d'utilisation beaucoup plus petit que la génération d'images statiques. Quoi qu'il en soit, bonne chance avec votre application :)
root.after (100, quelquefuncunc) code> et
gobject.timeout_add (100, quelqueefunc) code> ne sont pas terriblement compliqués. QT est un peu plus impliqué ...
Généralement, vous ne pouvez pas utiliser montrage () et dessiner () comme ceci. Comme les postes suggèrent, vous avez besoin d'une petite boucle d'interface graphique, il suffit de regarder les exemples d'animations sur la page MATPLOTLIB. P>
Après de nombreuses heures de combat avec ce même problème, je pense avoir trouvé la réponse: faire ces animations simples avec Matplotlib, vous pouvez Attention à utiliser ce backend, vous devez installer Pygtk. Je ne sais pas ce dont vous avez besoin sur Windows (parce que je suis sur Linux), mais cela semble le minimum. En outre, si vous souhaitez l'utiliser par défaut, vous devez ajouter cette ligne à votre matplotlibrc (sous Linux placé sur ~ / .matplotlib / matplotlibrc): p> à utiliser le autres backends, vous devez suivre l'officiel EXEMPLES MATPLOTLIB , mais cela signifie que vous avez Pour construire une application Mini-Gui, juste pour exécuter une animation simple et que je trouve cela assez terrible! p> p>
Je me luttais avec ce même problème pendant un certain temps. Je recommanderais de jeter un oeil à cet exemple: http://matplotlib.sourceforge.net/examples /Animation/strip_chart_demo.html p>
Je pensais que je suivais cet exemple exactement, mais cela ne fonctionnait pas. Il ne dirait que la fonction "mise à jour" une fois. Il s'agit de la seule différence dans mon code était que l'animation Animation.Funcanimation () code> n'a été attribuée à une variable. Dès que j'ai assigné la valeur de retour de
animation.funcanimation () code> à une valeur, tout a fonctionné. P>
J'avais (je pense) le même problème, où la fenêtre gèlerait si je me suis concentré sur elle ou essayé de le faire glisser, en utilisant Python 2.7 sur Windows 7 avec Matplotlib 1.3 et Tkagg Backend. J'ai eu un appel à temps.sleep (1) dans ma boucle principale, et quand j'ai remplacé cela avec PLT.Pause (1), cela résolue le problème. Ainsi, essayez d'utiliser la fonction de pause de Matplotlib plutôt que la fonction de sommeil du module de temps, cela a fonctionné pour moi. P>
appel de l'appel.sleep () ou plt.pause () provoque le scintillement sur la fenêtre du graphique lors de l'utilisation du blittement, mais j'ai eu de bons résultats en appelant simplement la boucle d'événement explicitement:
fig.canvas.blit() # or draw() fig.canvas.start_event_loop(0.001) #1 ms seems enough
Voici comment vous le feriez dans Python 3: P>
import matplotlib matplotlib.use('TkAgg') # Qt4Agg gives an empty, black window import matplotlib.pylab as plt import time # create initial plot z = zeros(10) line, = plot(z) ylim(-3, 3) for i in range(60): print('frame:', i) d = randn(10) line.set_ydata(d) draw() #replace time.sleep() with plt.pause() plt.pause(0.5)
J'ai essayé les codes ci-dessus sous Windows (64 bits) avec Python 2.6.5, Numpy 1.5.0B1 et Matplotlib 1.0.0 sans aucun problème à l'aide de la ligne CMD. Je les ai également essayés au ralenti et que le premier code se bloque et se bloque à la fin, mais la seconde a fonctionné bien qui m'a surpris. Je ne sais pas si cela aide du tout, mais là vous l'avez. Je n'ai pas de choses Qt installé, alors c'était tout avec TK.
Merci beaucoup Justin. Êtes-vous sûr que tous les cadres étaient affichés? Je reçois un couple avant que les choses se soient gelées moi-même.
Pensez que les problèmes QTAGG sont liés à ce GITUB LIMITE , UTILISATION PAUSE () avec PALEBAB. des œuvres de tirage (), également montrent () ne devrait pas être nécessaire.