Неожиданное замороженное окно matplotlib при каждом втором запуске моей программы

#python #matplotlib #animation #scipy #spyder

#python #matplotlib #Анимация #scipy #spyder

Вопрос:

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

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

 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, если это поможет.

Комментарии:

1. Мне кажется, что это ошибка отступа, но, возможно, ваш пост просто неправильно отформатирован?

2. @Reedinationer Второй бит кода? Оно было неправильно отформатировано. Исправлено, спасибо.