Python arrêt et simulation

a marqué ce sujet comme résolu.

Bonjour, j’ai un petit problème. En faite, j’ai fais des animations grâce à matplotlib avec funcanimation. Ce que j’aimerais c’est de pouvoir faire par exemple 10 simulations sans que j’intervienne, c’est-à-dire que j’aimerais faire une espèce de boucle for qui fait 10 simulations d’un coup par exemple. Sauriez-vous comment faire car là je bloque un petit peu.

Merci de votre aide si vous m’aidez !

Salut,

Naïvement, ta solution avec la boucle for me semble bien. Je mettrai toute ton animation dans une fonction et appellerai cette fonction.

Cependant selon tes animations et ton projet il y a peut-être d’autres solutions plus adapté (utilisation d’un moteur de jeu, …).

+0 -0

Le problème avec une boucle for, c’est qu’à chaque fin de programme, la simulation se lance mais je dois la fermer manuellement pour que la boucle for fasse son travail, c’est-à-dire relancer une autre simulation. J’aimerais rendre automatique car si j’ai 1000 simulations à faire pour récupérer des données je ne peux pas à chaque fois fermer manuellement une fenêtre et cela 1000 fois, cela sera trop lent !

voilà le problème xD merci de m’avoir répondu en tous cas.

(je tiens également à préciser que je m’y connais peu en python (je pense), donc tous ce qui est moteur de jeu et tous je n’ai aucune idée de ce que c’est.)

+0 -0

Je pense que tu dois ouvrir une nouvelle fenêtre pour chaque animation. Il faudrait que l’animation reste dans la même fenêtre.

Un moteur de jeu c’est en gros une librairie qui te facilite le développement (cf. pygame).

+0 -0

J’utilisais bien plt.show(), cependant je n’arrive pas à utiliser animation.save(). Est-ce qu’il faut que j’importe save de matplotlib ? et est-ce que le fichier dans laquelle j’enregistre ma simulation doit être crée avant la simulation ? ou bien python en crée un seul ? Car quand j’essaie, voici l’erreur qu’il m’affiche:

MovieWriter ffmpeg unavailable; trying to use <class 'matplotlib.animation.PillowWriter’> instead. Traceback (most recent call last): File "<console>", line 1, in <module> File "C:\Users\Hp\Desktop\Python\Cours\TIPE\Les différentes modélisations\modélisation et courbe.py", line 427, in prog anim.save(f) File "c:\users\hp\appdata\local\programs\python\python38–32\lib\site-packages\matplotlib\animation.py", line 1156, in save writer.grab_frame(**savefig_kwargs) File "c:\users\hp\appdata\local\programs\python\python38–32\lib\contextlib.py", line 131, in exit self.gen.throw(type, value, traceback) File "c:\users\hp\appdata\local\programs\python\python38–32\lib\site-packages\matplotlib\animation.py", line 232, in saving self.finish() File "c:\users\hp\appdata\local\programs\python\python38–32\lib\site-packages\matplotlib\animation.py", line 575, in finish self._frames[0].save( IndexError: list index out of range

merci pour vos réponses !

Comment en remplaçant simplement plt.show() par plt.ion() ? car quand je fais cela j’ai une fenêtre (bugé) vide. Même quand je place plt.ion() en tout début de programme. Je ne comprends pas comment l’utiliser, merci pour l’aide.

Je me demande également s’il faut que j’indique à l’animation quand elle termine car en faite je fais une simulation qui ne termine pas, c’est-à-dire qu’une simulation ne s’arrête jamais, est-ce un problème ou bien python arrête de lui-même à partir d’un moment ? (je pense qu’il faut que j’ajoute la condition d’arrêt mais bon je pose tout de même la question)

merci pour vos aides !

J’utilisais bien plt.show(), cependant je n’arrive pas à utiliser animation.save(). Est-ce qu’il faut que j’importe save de matplotlib ? et est-ce que le fichier dans laquelle j’enregistre ma simulation doit être crée avant la simulation ? ou bien python en crée un seul ? Car quand j’essaie, voici l’erreur qu’il m’affiche:

Sans code, on ne peut pas t’aider.

Je me demande également s’il faut que j’indique à l’animation quand elle termine car en faite je fais une simulation qui ne termine pas, c’est-à-dire qu’une simulation ne s’arrête jamais, est-ce un problème ou bien python arrête de lui-même à partir d’un moment ?

Python peut pas le deviner, il te faut une condition d’arrêt.

J’ai mis la condition d’arrêt c’est bon, cela marche plutôt bien.

En faite, j’ai procédé de cette manière:

  • utilisation d’une boucle "for"
  • mettre une condition d’arrêt grâce à plt.close(): ferme la fenêtre de simulation, qui permet à la boucle for de faire son travail, ie., relancer une nouvelle simulation.

Voilà, merci pour vos réponses en tous cas.

Il y a cependant un petit soucis, j’ai simplement une erreur mais qui n’empêche en rien le fonctionnement de cela:

Exception in Tkinter callback Traceback (most recent call last): File "c:\users\hp\appdata\local\programs\python\python38–32\lib\tkinter__init.py", line 1883, in call return self.func(*args) File "c:\users\hp\appdata\local\programs\python\python38–32\lib\tkinter__init.py", line 804, in callit func(*args) File "c:\users\hp\appdata\local\programs\python\python38–32\lib\site-packages\matplotlib\backends_backend_tk.py", line 338, in idle_draw self.draw() File "c:\users\hp\appdata\local\programs\python\python38–32\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 10, in draw _backend_tk.blit(self._tkphoto, self.renderer._renderer, (0, 1, 2, 3)) File "c:\users\hp\appdata\local\programs\python\python38–32\lib\site-packages\matplotlib\backends_backend_tk.py", line 80, in blit photoimage.blank() File "c:\users\hp\appdata\local\programs\python\python38–32\lib\tkinter__init__.py", line 4065, in blank self.tk.call(self.name, 'blank’) _tkinter.TclError: invalid command name "pyimage20"

DESCRIPTION:

  • Cette erreur vient seulement après la deuxième simulation

Sans code, on ne peut pas t’aider.

Ça fait la troisième fois que je te le demande… On veut bien aider, mais encore une fois on n’est pas magiciens. En plus si tu nous montres ton code, on pourra t’aider à améliorer le reste aussi si on voit des problèmes classiques de débutants. :)

Non du coup, je l’ai réglé.

Je ne comprend pas comment on enregistre une animation. Par exemple:

import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation

k = 2np.pi w = 2np.pi dt = 0.01

xmin = 0 xmax = 3 nbx = 100

x = np.linspace(xmin, xmax, nbx)

fig = plt.figure() # initialise la figure line, = plt.plot([],[]) plt.xlim(xmin, xmax) plt.ylim(-1,1)

fonction à définir quand blit=True

crée l’arrière de l’animation qui sera présent sur chaque image

def init(): line.set_data([],[]) return line,

def animate(i): t = i dt y = np.cos(kx - w*t) line.set_data(x, y) return line,

ani = animation.FuncAnimation(fig, animate, init_func=init, frames=100, blit=True, interval=20, repeat=False)

plt.show()

Comment faire ? (avec la technique de .save())

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte