Видео с пояснениями можно посмотреть на рутубе.

Код для приложения, которое строит графики по нажатию кнопки в едином окне — без запуска отдельного окна с самим графиком. В приложении можно вводить начальные данные — скорость, угол, ускорение свободного падения, тип линии, — и по нажатию кнопки получать нужную кривую.

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()

От IvanPetrov