Окно участка продолжает открываться после закрытия - PullRequest
0 голосов
/ 26 июня 2019

Я новичок в кодировании, и в данный момент я пытаюсь закодировать приложение, которое отслеживает движение из симуляции и визуализирует движение в окне графика.

Кажется, что команда перерыва не работает.

Вот обновленный код с предложением ответа @ bf-g ниже:

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()

Он делает то, что я хочу, но если я пытаюсь закрыть окно графика, он просто продолжает открываться, пока я не закрою программу.

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Я думаю, это потому, что ваш plt.draw() находится внутри цикла while, и он в основном открывает новое окно при каждой итерации в цикле while, и чтобы исправить это, вы можете поместить plt.draw() вне цикл, а затем разорвать цикл, когда вы хотите нарисовать график.

0 голосов
/ 26 июня 2019

while True: продолжит делать все, что внутри, до конца всех дней.Так что он не очень подходит для потока программ, который должен меняться в любой момент.Вместо этого вы хотели бы ввести условие, которое должно быть выполнено для продолжения цикла, while condition==True:.

С точки зрения кода, следующее просто выполняется вечно

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()

Такнам нужно ввести условие, при котором нельзя продолжать цикл.

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()

Это довольно сложно, поэтому в matplotlib есть встроенный модуль анимации, который делает то же самое в цикле событий программы.

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()
0 голосов
/ 26 июня 2019

Вы ищете обработчик событий .Событие, которое вы должны отслеживать, - это закрытие фигуры.Определите фигуру вне бесконечного цикла и добавьте обработчик событий:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...