Видео с пояснениями можно посмотреть на рутубе.
Код для приложения, которое строит графики по нажатию кнопки в едином окне — без запуска отдельного окна с самим графиком. В приложении можно вводить начальные данные — скорость, угол, ускорение свободного падения, тип линии, — и по нажатию кнопки получать нужную кривую.
from tkinter import *
import numpy as np
import tkinter as tk
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#Создание окна приложения
root = tk.Tk()
fig = plt.figure(figsize=[5,3])
root.title('Пользовательское приложение для построения графиков')
root.geometry('600x600')
frame=tk.Frame(root,padx=100,pady=10,bg='grey')
frame.pack()
#Создание полотна, на котором размещается объект fig
canvas1 = FigureCanvasTkAgg(fig, master=root)
canvas1.draw()
plot_widget = canvas1.get_tk_widget()
canvas1.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
#Включение интерактивного режима обновления
plt.ion()
#Задание процедуры, которая создаёт график
def graphXY():
#Читаем данные из полей ввода
#plt.cla()
V0=float(V0_E.get())
g=float(g_E.get())
alpha=np.pi/180*float(alp_E.get())
linestyle1=str(Linestyle.get())
N=NN
x=np.array([0.0]*N)
y=np.array([0.0]*N)
#блок вычислений
t_p=2*V0*(np.sin(alpha))/g #полное время полёта
t=np.linspace(0,t_p,N) #создание массива с равномерно распределёнными значениями времени
x=V0*np.cos(alpha)*t
y=V0*np.sin(alpha)*t-g*t**2/2
#блок вывода данных
plt.title('Траектория движения тела под углом к горизонту')
plt.xlabel('Координата х')
plt.ylabel('Координата y')
plt.grid(True)
plt.plot(x,y,linestyle=linestyle1,linewidth=5,label=alp_E.get())
plt.legend()
#Количество точек кривой
NN=150
#Организация ввода данных в записи
#Создание полей с надписями
V00=Label(frame,text='Введите начальную скорость V0 (м/с)',anchor='w')
V00.grid(row=1,column=1)
alp0=Label(frame,text='Введите угол альфа (градусы)',fg='black',anchor='w')
alp0.grid(row=2,column=1)
g0=Label(frame,text='Введите ускорение свободного падения (м/с^2)',anchor='w')
g0.grid(row=3,column=1,ipadx=0)
Linestyle0=Label(frame,text='Linestyle')
Linestyle0.grid(row=4,column=1)
#Создание полей ввода
V0_E=Entry(frame,)
V0_E.grid(row=1,column=2)
V0_E.insert(0,'10')
alp_E=Entry(frame)
alp_E.grid(row=2,column=2)
alp_E.insert(0,'30')
g_E=Entry(frame,)
g_E.grid(row=3,column=2)
g_E.insert(0,'9.81')
Linestyle=Entry(frame,)
Linestyle.grid(row=4,column=2)
Linestyle.insert(0,'solid')
Pusk=tk.Button(frame,text='Рассчитать траекторию',command=graphXY)
Pusk.grid(row=5,column=1)
def CLR():
plt.cla()
Del=tk.Button(frame,text='Очистить график',command=CLR)
Del.grid(row=5,column=2)
root.mainloop()