AttributeError: объект «Событие» не имеет атрибута «шире»

У меня есть эта программа, в которой я рисую прямоугольник на холсте, и когда я нажимаю клавишу со стрелкой < или клавишу >, прямоугольник должен становиться шире или уже. Но когда я запускаю эту программу и нажимаю любую из этих клавиш, оболочка python выводит AttributeError: Объект «Событие» не имеет атрибута «шире» (или «уже»)... A. Как я могу это исправить? и Б. Почему это происходит?

from tkinter import *
root = Tk()
canvas = Canvas(root, width=400, height=300, bg = "#000000")
canvas.pack()
x1 = 150
y1 = 100
x2 = 250
y2 = 200
class ResizeRect:
     def __init__(self, x1, y1, x2, y2):
         self.x1 = x1
         self.y1 = y1
         self.x2 = x2
         self.y2 = y2
         self.rect = canvas.create_rectangle(0,0,1,1)
     def draw(self):
         canvas.delete(self.rect)
         self.rect = canvas.create_rectangle(x1, y1, x2, y2,outline = "#00B000", width=2)
     def narrower(self):
         self.x1 = self.x1 + 5
         self.x2 = self.x2 - 5
     def wider(self):
         self.x1 = self.x1 - 5
         self.x2 = self.x2 + 5
r = ResizeRect(150, 100, 250, 200)
r.draw()
def left(r):
    r.narrower()
def right(r):
    r.wider()
canvas.bind_all('<KeyPress-Left>', left)
canvas.bind_all('<KeyPress-Right>', right)

Я также не знаю, исправлю ли/когда я это, все равно будет куча ошибок. Так что было бы здорово, если бы вы помогли мне с конкретной проблемой. Но было бы еще круче, если бы вы могли сказать мне, если и как исправить другие ошибки, которые появляются после этой.

Спасибо

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вам нужно указать аргумент для события, которое tkinter отправляет при использовании bind:

def left(event):
    r.narrower()

Эти методы также должны вызывать canvas.coords; простое обновление номеров не приведет к изменению дисплея.

Ваши процедуры left() и right() получают event, который вы в настоящее время не принимаете. Вы можете изменить свои процедуры, чтобы они были такими:

def left(e):
    r.narrower()
def right(e):
    r.wider()

Это избавит вас от ваших сообщений об ошибках. Теперь будут вызываться подпрограммы для сужения и расширения, но они не будут работать. Чтобы изменить размер прямоугольника, вам нужно работать с методом coords(). Изменяя координаты прямоугольника, вы можете эффективно перемещать или изменять его размер.

current_coords = canvas.coords(rectangleTagId)
# update the coords to new_coords
canvas.coords(rectangleTagId, *new_coords)

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