Неожиданное замороженное окно с рисунком matplotlib каждый второй раз, когда я запускаю свою программу - PullRequest
0 голосов
/ 29 марта 2019

Моя программа - симуляция солнечной системы.Я использую matplotlib для его анимации, затем, когда анимационная фигура закрыта, создайте и покажите график, используя данные моделирования.При использовании Spyder3.3.3 все работает, как задумано, при первом запуске кода, но если я пытаюсь запустить программу во второй раз, появляется пустое, не отвечающее на запросы окно перед выполнением анимации или графической части кода.Я должен получить окна, чтобы принудительно закрыть это окно, затем программа падает без каких-либо сообщений об ошибках.

Я думал, что проблема может быть в том коде, который я недавно добавил:

def onclose(evt):
        print("\n" + "Animation closed")
        fileout = open("SolarSystem total energy list.txt", "w")
        fileout.writelines(self.energy_str)
        graph_fig, graph_ax = plt.subplots(figsize=(10, 9))
        t_len = len(self.energy)
        y = np.around(np.divide(np.array(self.energy), 1e35), 12)
        x = np.linspace(0.0, self.timestep_hours*t_len, t_len)
        graph_ax.plot(x, y)
        graph_ax.set(xlabel="time(hours)", ylabel="total system energy (J [x10^35])")
        plt.show(block=False)
self.anim_fig.canvas.mpl_connect("close_event", onclose)

Однако,Когда я удаляю это, происходит точно такая же ошибка.Фактически, при каждом втором запуске код, похоже, застревает в этом блоке кода (который раньше всегда работал идеально):

while True:
    self.num_asteroids = int(input("Number of random asteroids (between 0 and 100): "))
    if self.num_asteroids >=0 and self.num_asteroids <=100 and isinstance(self.num_asteroids, int) == True :
        break
if self.num_asteroids != 0:
    for i in range(self.num_asteroids):
        while True:
            appearancetime = float(input("Time of appearance of random asteroid " + str(i+1) +  " in hours: "))
            if appearancetime >=0 and appearancetime <self.duration_hours:
                    self.asteroidlist.append(appearancetime)
                break

В консоли spyder ipython«Количество случайных астероидов (между 0 и 100):» появляется подсказка ввода, но я не могу напечатать.Так что, похоже, он застрял там, но я не знаю, почему всплыло окно matplotlib, поскольку только после этого в коде у меня появляются строки FuncAnimation() и plt.show().

Вотмой код анимации:

    for i in range(self.num_planets):
        self.patches.append(plt.Circle(self.planetlist[i].initial_position*1e-9, radiuslist[i], color=colourlist[i], animated=True))
    for i in range(self.asteroidlist.count(0.0)):
        self.patches.append(plt.Circle(tuple(self.bodylist[self.num_planets:][i].initial_position*1e-9), random.uniform(0.5, 1), color="#686868", animated=True))
    if simulation_type.upper() == "MARSSAT" or simulation_type.upper() == "MARS_SAT" or simulation_type.upper() == "JUPITERSAT" or simulation_type.upper() == "JUPITER_SAT":
        self.patches.append(plt.Circle(tuple(self.bodylist[-1].initial_position*1e-9), 0.5, colour="#37FF30", animated=True))
    for i in range(self.num_bodies):
        self.anim_ax.add_patch(self.patches[i])

    self.animation = FuncAnimation(self.anim_fig, self.update, init_func=self.anim_init, frames=self.total_frames, repeat=False, interval=self.interval, blit=True)

У меня есть spyder, настроенный на использование qt5, если это поможет.

...