Как заставить координаты фигуры при нажимании на стрелки клавиатуры записываться в массив?

У меня есть нарисованная фигура (квадрат),при нажимании стрелок она движется и печатает координаты квадрата только при первом нажатии стрелок, а надо что бы при каждом нажатии стрелок печатались координаты, и в дальнейшем я хотел записывать текущие координаты в массив(вернее обновлять их)

Есть код как у меня пока что все работает(но может он не совсем правильный)

from tkinter import *     
from tkinter import ttk
import turtle
import random
from array import *
import time
from datetime import datetime

root = Tk()     
root.title("Maze Generator") 
root.geometry("700x700")

canvas = Canvas(width=600, height=600) # создание поля для рисования
canvas.pack() # размещение поля
draw = turtle.RawTurtle(canvas)
canvas.focus_set()

up_x = 0
up_y = -20
down_x = 0
down_y = 20 
left_x = -20
left_y = 0 
right_x = 20
right_y = 0

x1 = 100
y1 = 100
x2 = 120
y2 = 120

rectangle = canvas.create_rectangle(x1,y1,x2,y2, fill='green')
coordinates = [canvas.coords(rectangle)]


def up_com():
    canvas.bind('<Up>', lambda event: canvas.move(rectangle, up_x, up_y))
    print(canvas.coords(rectangle))   

def down_com():
    canvas.bind('<Down>', lambda event: canvas.move(rectangle, down_x, down_y )) 
    print(canvas.coords(rectangle))

def left_com():
    canvas.bind('<Left>', lambda event: canvas.move(rectangle, left_x, left_y))
    print(canvas.coords(rectangle))

def right_com():
    canvas.bind('<Right>', lambda event: canvas.move(rectangle, right_x, right_y))
    print(canvas.coords(rectangle))


def start():
    a = canvas.bind('<Up>', lambda event: up_com(), )
    b = canvas.bind('<Down>', lambda event: down_com() )
    c = canvas.bind('<Left>', lambda event: left_com() )
    d = canvas.bind('<Right>', lambda event: right_com() )

canvas.bind('<Up>', lambda event: start(), )
canvas.bind('<Down>', lambda event: start() )
canvas.bind('<Left>', lambda event: start() )
canvas.bind('<Right>', lambda event: start() )

root.mainloop()

Ответы (1 шт):

Автор решения: insolor

Зачем постоянно перепривязывать обработчики нажатия на кнопки?

Сейчас вы три раза перепривязываете обработчики, внутри функций up_com и других добавляете обработчики, которые координаты не печатают, но двигают. А предыдущие обработчики наоборот - печатают координаты, но не двигают.

Нужно выкинуть всю лишнюю перепривязку. Один раз привяжите up_com и прочие функции, внутри них без бинда (просто напрямую) вызывайте canvas.move. Дальше уже в обработчики добавляйте что вам нужно.

...

rectangle = canvas.create_rectangle(x1,y1,x2,y2, fill='green')
coordinates = [canvas.coords(rectangle)]


def up_com():
    canvas.move(rectangle, up_x, up_y)
    print(canvas.coords(rectangle))
    coordinates.append(canvas.coords(rectangle))

def down_com():
    canvas.move(rectangle, down_x, down_y )
    print(canvas.coords(rectangle))
    coordinates.append(canvas.coords(rectangle))

def left_com():
    canvas.move(rectangle, left_x, left_y)
    print(canvas.coords(rectangle))
    coordinates.append(canvas.coords(rectangle))

def right_com():
    canvas.move(rectangle, right_x, right_y)
    print(canvas.coords(rectangle))
    coordinates.append(canvas.coords(rectangle))


def start():
    canvas.bind('<Up>', lambda event: up_com(), )
    canvas.bind('<Down>', lambda event: down_com() )
    canvas.bind('<Left>', lambda event: left_com() )
    canvas.bind('<Right>', lambda event: right_com() )

start()

root.mainloop()
→ Ссылка