Почему мое программирование предполагает, что привязка события является строкой?

Вот весь мой код (100 строк)

В частности, эта часть дает ошибку:

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, который вы передаете, — это строка.

Delrius Euphoria 14.12.2020 19:31
event= "<Motion>" по умолчанию устанавливает его в строку.
Barmar 14.12.2020 19:32

@Barmar так и должно быть event = <Motion>?

10 Rep 14.12.2020 19:32

Нет, это должен быть объект Event.

Barmar 14.12.2020 19:33

@ 10Rep это был бы недопустимый синтаксис.

Random Davis 14.12.2020 19:33

@RandomDavis Я знал об этом, просто интересно, что передать в качестве параметра.

10 Rep 14.12.2020 19:35

Когда вы вызываете bind, tkinter передает событие по умолчанию (автоматически), и я думаю, что это должен быть первый параметр, а здесь вы его не определили.

Delrius Euphoria 14.12.2020 19:35

Просто event должен это сделать.

Delrius Euphoria 14.12.2020 19:36

Это не то, как вы «привязываете» функцию к событию в tkinter. Вы делаете это с помощью чего-то вроде my_widget.bind("<Motion>", my_function).

martineau 14.12.2020 19:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
9
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы забыли передать событие, поэтому оно использует событие по умолчанию, которое вы определили как строку "<Motion>". Чтобы исправить это, передайте объект события (который вы назвали x2):

c.bind_all("<Motion>", lambda x2: player.mouse_movement(180, x2))

Другие вопросы по теме