В частности, эта часть дает ошибку:
def mouse_movement(self, angle, event= "<Motion>"):
x, y = event.x, event.y
relx, rely = x - self.player_coord_x, self.player_coord_y
self.angle = (180 / math.pi) * -math.atan2(rely, relx)
p = Image.open("tank.png")
p.rotate(angle)
p2 = ImageTk.PhotoImage(p)
p2.image = p2
player2 = c.create_image(self.coords[0], self.coords[1], image=p2)
В этой части кода я передаю параметр с именем event
. Он привязывает мышь к движению игрока. Однако это дает мне ошибку атрибута:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\offcampus\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:\Users\offcampus\Desktop\GameFolder\main.py", line 131, in <lambda>
c.bind_all("<Motion>", lambda x2: player.mouse_movement(180))
File "C:\Users\offcampus\Desktop\GameFolder\main.py", line 50, in mouse_movement
x, y = event.x, event.y
AttributeError: 'str' object has no attribute 'x'
Программа принимает параметр события как строку, а не как привязку мыши. Что я делаю не так в этом случае?
event= "<Motion>"
по умолчанию устанавливает его в строку.
@Barmar так и должно быть event = <Motion>
?
Нет, это должен быть объект Event.
@ 10Rep это был бы недопустимый синтаксис.
@RandomDavis Я знал об этом, просто интересно, что передать в качестве параметра.
Когда вы вызываете bind
, tkinter передает событие по умолчанию (автоматически), и я думаю, что это должен быть первый параметр, а здесь вы его не определили.
Просто event
должен это сделать.
Это не то, как вы «привязываете» функцию к событию в tkinter. Вы делаете это с помощью чего-то вроде my_widget.bind("<Motion>", my_function)
.
Вы забыли передать событие, поэтому оно использует событие по умолчанию, которое вы определили как строку "<Motion>"
. Чтобы исправить это, передайте объект события (который вы назвали x2
):
c.bind_all("<Motion>", lambda x2: player.mouse_movement(180, x2))
Потому что
event
, который вы передаете, — это строка.