#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 Второй бит кода? Оно было неправильно отформатировано. Исправлено, спасибо.