Как создать анимацию рисования из графика функций? Tkinter, matplotlib
Здраствуйте. Я написал Десктоп-приложение в котором при нажатии график появится соответствующий график. Мне нужно чтобы его месте график рисовался медленнно, через анимацию. Много что пробовал не помогает. Полный код:
from tkinter import ttk
import numpy as np
import matplotlib as plt
from PIL import Image, ImageTk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import warnings
from matplotlib.pyplot import figure
def evaluate(event):
# mystr = entry.get()
# exec('f = lambda x:' + mystr, globals())
M = float(strM.get()) # 100
N = int(strN.get()) # 100
l = float(strl.get()) # 1
T = float(strT.get()) # 1
tau = T / M
hx = l / N
pi = 3.14
k = 1
U0 = np.zeros(N)
U1 = np.zeros(N)
x = np.linspace(0, 1, N)
for i in range(0, N):
x[i] = i * hx
for i in range(0, N):
U0[i] = np.sin(pi * i * hx)
while (k <= M / 1):
# print("k=", k)
for i in range(2, N - 2):
U1[i] = U0[i] + (tau * U0[i] * (U0[i + 1] - U0[i])) / 2 * hx + (
tau * (U0[i + 2] - 2 * U0[i + 1] + 2 * U0[i - 1] - U0[i - 2])) / 2 * pow(hx, 3)
U1[0] = U1[1] = U1[N - 1] = 0
# for i in range(1, N - 2):
# if (U0[i] - U1[i]) < eps: break
U0[:] = U1
k = k + 1
print(U1)
ax.clear() # очистить графическую область
ax.plot(x, U1, linewidth=1)
ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5)
canvasAgg.draw() # перерисовать "составной" холст
def evaluate2(event):
root.after(100, evaluate, event)
root = Tk()
root.wm_title("Симуляция уравнения")
warnings.filterwarnings("error")
frameUp = Frame(root, relief=SUNKEN, height=125)
frameUp.pack(side=TOP, fill=X)
Label(frameUp, text="Кортевег де-Фриз теңдеуі: ").place(x=20, y=4, width=150, height=15)
Label(frameUp, text="M:").place(x=250, y=4, width=140, height=25)
Label(frameUp, text="N:").place(x=370, y=4, width=140, height=25)
Label(frameUp, text="l:").place(x=250, y=50, width=140, height=25)
Label(frameUp, text="Т:").place(x=370, y=50, width=140, height=25)
load = Image.open("1.jpg")
render = ImageTk.PhotoImage(load)
img = ttk.Label(root, image=render)
img.image = render
img.place(x=6, y=30, width=250, height=70)
strM = StringVar()
strM.set(100)
entryM = Entry(frameUp, relief=RIDGE, borderwidth=4, textvariable=strM)
entryM.place(x=280, y=30, width=80, height=25)
entryM.bind("<Return>", evaluate)
strN = StringVar()
strN.set(100)
entryN = Entry(frameUp, relief=RIDGE, borderwidth=4, textvariable=strN)
entryN.place(x=400, y=30, width=80, height=25)
entryN.bind("<Return>", evaluate)
strl = StringVar()
strl.set(1)
entryl = Entry(frameUp, relief=RIDGE, borderwidth=4, textvariable=strl)
entryl.place(x=280, y=70, width=80, height=25)
entryl.bind("<Return>", evaluate)
strT = StringVar()
strT.set(1)
entryT = Entry(frameUp, relief=RIDGE, borderwidth=4, textvariable=strT)
entryT.place(x=400, y=70, width=80, height=25)
entryT.bind("<Return>", evaluate)
#
fig = plt.figure(figsize=(5, 4), dpi=100, facecolor='white')
ax = fig.add_subplot(111)
canvasAgg = FigureCanvasTkAgg(fig, master=root)
canvasAgg.draw()
canvas = canvasAgg.get_tk_widget()
canvas.pack(fill=BOTH )
btn = Button(root, text='График')
btn.bind("<Button-1>", evaluate2)
btn.pack(ipady=2, pady=4, padx=10)
root.bind('<Control-z>', lambda event: root.destroy())
root.mainloop()