Как заставить координаты фигуры при нажимании на стрелки клавиатуры записываться в массив?
У меня есть нарисованная фигура (квадрат),при нажимании стрелок она движется и печатает координаты квадрата только при первом нажатии стрелок, а надо что бы при каждом нажатии стрелок печатались координаты, и в дальнейшем я хотел записывать текущие координаты в массив(вернее обновлять их)
Есть код как у меня пока что все работает(но может он не совсем правильный)
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 шт):
Зачем постоянно перепривязывать обработчики нажатия на кнопки?
Сейчас вы три раза перепривязываете обработчики, внутри функций 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()