Программа останавливается и не обращает внимания на нажатие кнопок
Пишу простую игру, в которой пользователь задаёт мячу направление и силу полёта и должен попасть в мишень. Однако возникла проблема: программа по какой-то причине останавливается и не обращает внимания на нажатие кнопок. Я почти не имею опыта работы с 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.