Задать вопрос
@Frost091

Где ошибка в коде?

62721bd9e9b5d808716433.png
# -*- coding: utf-8 -*
# Моделирование задачи о теле
# брошенном под углом к горизонту
# -
import tkinter
from tkinter import *
import math



#
def plot_x_axe(x0, y0, x1):
    x_axe = []
    xx = (x0, y0)
    x_axe.append(xx)
    xx = (x1, y0)
    x_axe.append(xx)
    canvas.create_line(x_axe, fill="black", width=2)


#
def plot_y_axe(x0, y0, y1):
    y_axe = []
    yy = (x0, y1)
    y_axe.append(yy)
    yy = (x0, y0)
    y_axe.append(yy)
    canvas.create_line(y_axe, fill="black", width=2)


#
def DrawGraph():
    # Получаем и пересчитываем параметры
    dta = sc.get()
    alpha = dta_math.pi / 180
    dtlbl = clist.get()
    # Очищаем область для текста
    canvas.create_rectangle(x1i - 90, y1i - 50,
                            x1i + 50, y1i + 10, fill="#eeeeff")
    # Считаем g=10, v0 подбираем, чтобы всё влезало в canvas
    g = 10.0
    v0 = 63
    #
    S = int((v0 ** 2) * math.sin(2 * alpha) / g)
    H = int(((v0 ** 2) * (math.sin(alpha)) ** 2) / (2 * g))
    #
    points = []
    for x in range(x0i, x1i):

        xx = (x - x0)
        y = (xx * math.tan(alpha)) - ((xx - -2) - g / \
                                      (2 * (v0 ** 2) * (math.cos(alpha) ** 2)))
        #
        if y > 0:

            yy = int(y0 - y)
        else:

            yy = y0i
        #
        pp = (x, yy)
        points.append(pp)
        # Собственно график
        canvas.create_line(points, fill=dtlbl, smooth=1)
        plot_x_axe(x0i, y0i, x1i)
        # Параметры графика
        dtext = "Дальность: " + str(S)
        vtext = "Высота: " + str(H)
        dalnost = canvas.create_text(x1i - 70, y1i - 30, text=dtext,
                                     fill=dtlbl, anchor="w")
        vysota = canvas.create_text(x1i - 70, y1i - 10, text=vtext,
                                    fill=dtlbl, anchor="w")


#
# Основная часть
dsk = tkinter.Tk()
dsk.title("Моделирование полёта")
# Верхняя часть окна со списком и кнопками
menuframe = Frame(dsk)
menuframe.pack(side = TOP, fill= X)
# Надпись для списка
lbl = tkinter.Label(menuframe)
lbl["text"] = "Выбор цвета:"
lbl.pack({"side": "left"})
# Инициализация и формирование списка
clist = tkinter.StringVar()
clist.set('black')
#
cspis = tkinter.OptionMenu(menuframe, clist,
                           'red',
                           'green',
                           'blue',
                           'cyan',
                           'magenta',
                           'purple',
                           'black')
cspis.pack({"side": "left"})
# Кнопка управления рисованием
btnOk = tkinter.Button(menuframe)
btnOk["text"] = "Нарисовать"
btnOk["command"] = DrawGraph
btnOk.pack({"side": "left"})
# Кнопка закрытия приложения
calc_but = Button(dsk, text='Закрыть', command=quit)
calc_but.pack({"side": "right"})
#
# Надпись для шкалы углов
lbl2 = tkinter.Label(dsk)
lbl2["text"] = "Угол, градусы:"
lbl2.pack({"side": "top"})
# Шкала углов
sc = tkinter.Scale(dsk, from_=0, to=90, orient="horizontal")
sc.pack({"side": "top", "fill": "x"})
#
# Область рисования (холст)
canvas = tkinter.Canvas(tk)
canvas["height"] = 360
canvas["width"] = 480
canvas["background"] = "#eeeeff"
canvas["borderwidth"] = 2
canvas.pack({"side": "bottom"})
#
# Установки осей координат
x0 = 50.0
y0 = 300.0
x1 = 450.0
y1 = 50.0
#
x0i = int(x0)
x1i = int(x1)
y0i = int(y0)
y1i = int(y1)
# Оси координат
plot_x_axe(x0i, y0i, x1i)
plot_y_axe(x0i, y0i, y1i)
#
tk.mainloop()

P.S : Вторая ошибка вылазит при нажатии кнопки "нарисовать". 62721d3a7da57051964529.png
Как устранить эти две ошибки ?
В конечном итоге кода, должен получиться интерфейс, с помощью которого можно будет указав угол полета (тела брошенного под углом к горизонту), изобразить траекторию полёта этого тела.
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
@AntVlad
На 117 строке надо заменить на
canvas = tkinter.Canvas()
А на 35-й надо понять, что за формула там применяется:
alpha = dta_math.pi / 180
Здесь видимо ошибка в нижнем подчеркивании. Похоже, что вместо него должна быть какая-то арифметическая операция. В dta получаем градусы. Потом их надо, судя по всему, перемножить с числом пи и поделить на 180. Тут похоже на какой-то расчет градусов в радианы или наоборот.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы