У меня есть эта программа, в которой я рисую прямоугольник на холсте, и когда я нажимаю клавишу со стрелкой < или клавишу >, прямоугольник должен становиться шире или уже. Но когда я запускаю эту программу и нажимаю любую из этих клавиш, оболочка 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)
Я также не знаю, исправлю ли/когда я это, все равно будет куча ошибок. Так что было бы здорово, если бы вы помогли мне с конкретной проблемой. Но было бы еще круче, если бы вы могли сказать мне, если и как исправить другие ошибки, которые появляются после этой.
Спасибо






Вам нужно указать аргумент для события, которое 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)