Программа останавливается и не обращает внимания на нажатие кнопок

Пишу простую игру, в которой пользователь задаёт мячу направление и силу полёта и должен попасть в мишень. Однако возникла проблема: программа по какой-то причине останавливается и не обращает внимания на нажатие кнопок. Я почти не имею опыта работы с tkinter, не смог найти ошибку сам. Вот программа:

import tkinter as tk
from random import randint
from math import sin, cos

height = 1000
radius = 10

wind = tk.Tk()
c = tk.Canvas(width=2000, height=height, bg='lightblue')
c.pack()
c.focus_set()

def cy(y):      # конвертер y
    return height - y

class arrow:    # класс стрелка
    def dx(self, r, alfa):
        return r * cos(alfa)
    def dy(self, r, alfa):
        return r * sin(alfa)

    def redraw(self):
        c.coords(arrow, radius, cy(radius),
                 radius + self.dx(self.speed, self.angle),
                 radius + self.dy(self.speed, self.angle))

    def loop(self):
        if not self.stop:
            wind.after(1000, self.loop)

    def update_dxdy(self):
        self.dx = self.dx(self.speed, self.angle)
        self.dy = self.dy(self.speed, self.angle)
        
    def __init__(self):    # показ и настройка стрелки, здесь возникла проблема
        self.stop = False        
        self.speed = 30
        self.angle = 45
        arrow = c.create_line(radius, cy(radius),
                              radius + self.dx(self.speed, self.angle),
                              cy(radius + self.dy(self.speed, self.angle)),
                              fill='green', width=3, arrow='last', tags='arr')

        c.bind('<Up>', self.inc_angle)
        c.bind('<Down>', self.dec_angle)
        c.bind('<Left>', self.dec_speed)
        c.bind('<Right>', self.inc_speed)
        c.bind('<Return>', self.stop)
    
        self.update_dxdy()
        self.loop()
        
    def inc_speed(self, event):    # управление кнопками
        self.speed += 3
        self.update_dxdy()
        self.redraw()

    def dec_speed(self, event):
        self.speed -= 3
        self.update_dxdy()
        self.redraw()

    def inc_angle(self, event):
        self.angle += 3
        self.update_dxdy()
        self.redraw()

    def dec_angle(self, event):
        self.angle -= 3
        self.update_dxdy()
        self.redraw()
        
    def stop(self, event):
        c.delete('arr')
        self.stop = True

    
def game():    # сама игра
    r_num1 = randint(100, 2000)
    r_num2 = randint(1, height - 40)
    n3 = r_num1
    n4 = r_num2 + 60
    
    target = c.create_line(r_num1, r_num2, n3, n4, width=10, fill='red')

    arr = arrow()

    while not ball in set(c.find_overlapping(*c.coords(target))):
        if c.coords(ball)[2] > 2000 or c.coords(ball)[0] < 0:
            arr.dx= -arr.dx
        if c.coords(ball)[3] > height or c.coords(ball)[1] < 0:
            arr.dy = -arr.dy
        c.move(ball, arr.dx, arr.dy)
        arr.dy += 0.5
        wind.update()
        wind.after(20)
    c.delete('ball')
    c.create_text(1000, 400, fill='darkblue', text='You won!')

ball = c.create_oval(0, cy(0), 2 * radius, cy(2 * radius),
                     fill='black', tags='ball')
game()

wind.mainloop()

Помогите исправить ошибку, пожалуйста (с объяснением).

Проблема возникла в __init__. Программа должна обрабатывать нажатия клавиш-стрелок, пока не будет нажата Enter.


Ответы (0 шт):