0
votes

La fenêtre de tracé continue de s'ouvrir après la fermeture

Je suis nouveau dans le codage et en ce moment j'essaie de coder une application qui suit un mouvement à partir d'une simulation et visualise le mouvement dans la fenêtre de tracé.

Aucune commande de pause ne semble fonctionner. p >

Voici le code mis à jour avec la suggestion de la réponse de @ bf-g ci-dessous incoorporated:

def handle_close(evt):
    raise SystemExit('Closed figure, exit program.')

fig = plt.figure()
fig.canvas.mpl_connect('close_event', handle_close)# Definition der figure

while True:

    plt.clf() # vorherige Plots clearen

    for i in range(0, int(alpha_max), 5):
            plt.plot(Drehachse_x + Radius*np.cos((i+alpha_0)*np.pi/180), Drehachse_y + Radius*np.sin((i+alpha_0)*np.pi/180), color='red', marker='*', markersize=1)

    for i in range(0, int(alpha_max), 2):
            plt.plot(Drehachse_x + Radius_Heckklappe*np.cos((i+alpha_0+beta_0+delta)*np.pi/180), Drehachse_y + Radius_Heckklappe*np.sin((i+alpha_0+beta_0+delta)*np.pi/180), color='red', marker='*', markersize=1.5)


    alpha = "PATH"
    Schwerpunkt_x = "PATH"
    Schwerpunkt_y = "PATH"
    Spindel_Heck_x = "PATH"
    Spindel_Heck_y = "PATH"

    x=(Drehachse_x, Schwerpunkt_x)
    y=(Drehachse_y, Schwerpunkt_y)

    x1=(Spindel_Heck_x, Spindel_Karo_x)
    y1=(Spindel_Heck_y, Spindel_Karo_y)

    plt.axis('equal')
    plt.axis([3100, 3800, 600, 1400])

    plt.plot(x,y, color="blue", linewidth=2.0, linestyle="-", marker='o', label='$Heckklappe$')
    plt.plot(x1, y1, color="green", linewidth=2.0, linestyle="-", marker='o', label='$Spindel$')
    plt.plot(x_g_max, y_g_max, color="orange", linewidth=2.0, linestyle="--", marker='*', label='$Maximal$')
    plt.plot(x_g_min, y_g_min, color="red", linewidth=2.0, linestyle="--", marker='*', label='$Minimal$')

    plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
               fancybox=True, shadow=True, ncol=5)

    plt.pause(0.001)
    plt.text(0.35, 0.5, 'Close Me!', dict(size=30))
    plt.draw()

Il fait ce que je veux qu'il fasse, mais si j'essaye de ferme la fenêtre de tracé, elle continue de s'ouvrir jusqu'à ce que je ferme le programme.


0 commentaires

3 Réponses :


1
votes

Je pense que c'est parce que votre plt.draw () est à l'intérieur de la boucle while, et il ouvre fondamentalement une nouvelle fenêtre chaque fois qu'il itère dans la boucle while , et pour résoudre ce problème, vous pouvez mettre le plt.draw () en dehors de la boucle, puis interrompre la boucle lorsque vous voulez dessiner le graphique.


3 commentaires

Merci pour votre réponse rapide!. Je veux que la fenêtre de tracé continue de mettre à jour le tracé jusqu'à ce que je le ferme. Quelle commande break me permettra cela?


@GanZo Vous pouvez essayer plt.clear () avant le plt.plot (...) : source from cette question


malheureusement ce n'était pas ça



0
votes

Vous recherchez un gestionnaire d'événements . L'événement que vous devez surveiller est la fermeture de la figure. Définissez la figure en dehors de la boucle infinie et ajoutez le gestionnaire d'événements:

import matplotlib.pyplot as plt

def handle_close(evt):
    raise SystemExit('Closed figure, exit program.')

fig = plt.figure()
fig.canvas.mpl_connect('close_event', handle_close)

while True:
    plt.text(0.35, 0.5, 'Close Me!', dict(size=30))
    plt.show()


7 commentaires

Cela change-t-il quelque chose si j'utilise "plt.schow ()" au lieu de "plt.draw ()"?


Ouais, c'est juste un exemple. Utilisez plt.draw () pour mettre à jour votre tracé.


Veuillez accepter / voter pour la réponse si elle a résolu votre question.


Désolé, je suis nouveau dans le codage. Je ne sais pas vraiment pourquoi. Mais cela n'a pas du tout changé le fonctionnement du programme. Peut-être qu'il doit y avoir une commande comme plt.close (fig)?


Oui, indentez simplement rise SystemExit ('Chiffre fermé, quittez le programme.') correctement.


comme ça ? si tu veux dire ça, alors c'était juste une erreur ici pas dans mon code


il n'y a pas eu d'erreur. le problème était que chaque fois que j'essayais de fermer la fenêtre de tracé, elle ne cessait de s'ouvrir à nouveau ... aucune déclaration d'erreur



0
votes

while True: continuera à faire tout ce qui est à l'intérieur jusqu'à la fin de tous les jours. Ce n'est donc pas bien adapté à un flux de programme qui doit changer à tout moment. Au lieu de cela, vous voudrez introduire une condition qui doit être remplie pour que la boucle continue, while condition == True: .

En termes de code, ce qui suit ne fonctionne que pour toujours p >

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

fig, ax = plt.subplots()

phi = 0
x = np.linspace(0,2*np.pi)
y = np.sin(x)
line, = ax.plot(x,y)

def animate(i):
    phi = i/10
    y = np.sin(x+phi)
    line.set_ydata(y)

    print(f"Still running; phi={phi}")

ani = FuncAnimation(fig, animate) 

plt.show()

Nous devons donc introduire une condition pour ne pas continuer la boucle.

import numpy as np
import matplotlib.pyplot as plt

plt.ion()

fig, ax = plt.subplots()

phi = 0
x = np.linspace(0,2*np.pi)
y = np.sin(x)
line, = ax.plot(x,y)

condition = True 

def on_close(evt=None):
    global condition
    condition = False

fig.canvas.mpl_connect("close_event", on_close)

while condition:
    phi += 0.1
    y = np.sin(x+phi)
    line.set_ydata(y)

    plt.pause(0.1)
    print(f"Still running; phi={phi}")

plt.ioff()
plt.show()

C'est assez compliqué, donc matplotlib a un module d'animation intégré pour faire de même dans la boucle d'événements du programme.

import numpy as np
import matplotlib.pyplot as plt

plt.ion()

fig, ax = plt.subplots()

phi = 0
x = np.linspace(0,2*np.pi)
y = np.sin(x)
line, = ax.plot(x,y)

while True:
    phi += 0.1
    y = np.sin(x+phi)
    line.set_ydata(y)

    plt.pause(0.1)
    print(f"Still running; phi={phi}")

plt.ioff()
plt.show()


1 commentaires

Ça y est ...! Merci