我已经用Tkinter用Python编写了代码,但是有问题。
有一些代码:
main.py:
import animation as a
def draw_animation():
copyfile(biological_system_filepath, 'biological_system_parameters.tmp')
a.create_animation()
print('It is done.')
os.remove('biological_system_parameters.tmp')
animation = Button(root, text='Animation', command=draw_animation, width=50)
animation.pack()
root.mainloop()
animation.py:
def create_animation():
style.use('ggplot')
sns.set_palette(sns.color_palette("hls", 2))
fig = plt.figure(figsize=(16, 10))
trajectory = np.loadtxt('trajectory.txt', delimiter=' ', unpack=True)
energy = np.loadtxt('energy.txt', delimiter=' ', unpack=True)
velocity = np.loadtxt('velocity.txt', delimiter=' ', unpack=True)
ax1 = fig.add_subplot(2, 2, (1, 3), projection='3d')
obj1, = ax1.plot(trajectory[0], trajectory[1], trajectory[2])
biological_system = [[], [], [], []]
biological_system[0], biological_system[1], biological_system[2], biological_system[3] = np.loadtxt(
'biological_system_parameters.tmp', delimiter=' ', unpack=True)
ax1.plot(biological_system[0] / 10, biological_system[1] / 10, biological_system[2] / 10, 'o', markersize=1)
trajectory_xlim, trajectory_ylim, trajectory_zlim = adjust_limits3D('trajectory.txt')
ax1.set_xlim(trajectory_xlim)
ax1.set_ylim(trajectory_ylim)
ax1.set_zlim(trajectory_zlim)
ax1.set_xlabel('x[nm]')
ax1.set_ylabel('y[nm]')
ax1.set_zlabel('z[nm]')
ax1.set_title('Trajektoria cząstki')
ax2 = fig.add_subplot(2, 2, 2)
obj2, = ax2.plot(energy[0], energy[1])
energy_xlim, energy_ylim = adjust_limits('energy.txt')
ax2.set_xlim(energy_xlim)
ax2.set_ylim(energy_ylim)
ax2.set_xlabel('t[ns]')
ax2.set_ylabel('E[eV]')
ax2.set_title('Wykres energii całkowitej od czasu')
ax3 = fig.add_subplot(2, 2, 4)
obj3, = ax3.plot(velocity[0], velocity[1])
velocity_xlim, velocity_ylim = adjust_limits('velocity.txt')
ax3.set_xlim(velocity_xlim)
ax3.set_ylim(velocity_ylim)
ax3.set_xlabel('t[ns]')
ax3.set_ylabel('v[m/s]')
ax3.set_title('Wykres prędkości cząstki od czasu')
def init():
obj1.set_data([], [])
obj1.set_3d_properties([])
obj2.set_data([], [])
obj3.set_data([], [])
return obj1, obj2, obj3,
def animate(i):
nonlocal STEP
j = i * STEP
if j % 1000 == 0:
print(j)
obj1.set_data(trajectory[0, :j], trajectory[1, :j])
obj1.set_3d_properties(trajectory[2, :j])
obj2.set_data(energy[0, :j], energy[1, :j])
obj3.set_data(velocity[0, :j], velocity[1, :j])
return obj1, obj2, obj3,
STEP = 1000
frames_num = math.floor(len(energy[0]) / STEP)
ani = animation.FuncAnimation(fig, animate, init_func=init, frames=frames_num, blit=True)
Writer = animation.writers['ffmpeg']
writer = Writer(fps=60, metadata=dict(artist='Me'))
ani.save('animacja.mp4', writer=writer)
plt.show()
我不明白为什么要一遍又一遍地调用函数a.create_animation()
,并且直到我单击关闭动画窗口的红色十字按钮后才打印'It is done.'
。我知道一遍又一遍地调用它,因为我在j
方法中打印了“ animate()
”值。
示例输出:
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000 24000 25000 26000 27000 28000 29000 30000 31000 32000 33000 34000 35000 0 1000 2000 3000 4000 5000完成。