#python #tkinter
#питон #tkinter
Вопрос:
Как заставить квадрат менять направление и двигаться в правильном направлении при нажатии кнопок «w, a, s, d» (чтобы он двигался сам, после одного нажатия кнопки, задающей направление) Без использования классов
from tkinter import * root = Tk() root.title('Snake') root["width"] = 400 root["height"] = 400 field = Canvas(root) rectangle = field.create_rectangle(10, 20, 30, 40) field.grid(row=0, column=0) def w(y): field.move(rectangle, 0, y) y = 1 root.after(5) def s(y): field.move(rectangle, 0, y) y -= 1 root.after(5) def a(x): field.move(rectangle, x, 0) x -= 1 root.after(5) def d(x): field.move(rectangle, x, 0) x = 10 root.after(5) x=0 y=0 def snake(event): if event.char == 'w': w(y) elif event.char == 'a': a(x) elif event.char == 's': s(y) elif event.char == 'd': d(x) field.move(rectangle, x, y) root.bind("lt;Keygt;", snake) root.mainloop()
Ответ №1:
Вам нужно объявить две глобальные переменные для направлений x и y, например dx
, и dy
.
Затем, если вы хотите, чтобы прямоугольник продолжал двигаться, вам нужно использовать .after()
цикл.
from tkinter import * root = Tk() root.title('Snake') root["width"] = 400 root["height"] = 400 field = Canvas(root) rectangle = field.create_rectangle(10, 20, 30, 40) field.grid(row=0, column=0) def move_snake(): field.move(rectangle, dx, dy) # change the delay value 30 (ms) to other value to suit your case root.after(30, move_snake) # initial directions for x and y dx = 0 dy = 0 def change_direction(event): global dx, dy if event.char in 'wasd': dx = dy = 0 if event.char == 'w': dy = -1 # move up elif event.char == 'a': dx = -1 # move left elif event.char == 's': dy = 1 # move down elif event.char == 'd': dx = 1 # move right root.bind("lt;Keygt;", change_direction) move_snake() # start the moving loop root.mainloop()
Ответ №2:
Вместо увеличения и уменьшения x,y
, имеет значение по умолчанию, которое вы изменяете в соответствии с направлением —
from tkinter import * root = Tk() root.title('Snake') root["width"] = 400 root["height"] = 400 field = Canvas(root) rectangle = field.create_rectangle(10, 20, 30, 40) field.grid(row=0, column=0) x = 0 # Default y = 0 speed = 10 # Set your speed. The lesser the value, the more fast def pos(event): global x, y x = 0 y = 0 if event.char == 'w': y = -1 # Changes the default values elif event.char == 'a': x = -1 elif event.char == 's': y = 1 elif event.char == 'd': x = 1 def snake(): field.move(rectangle, x, y) root.after(speed, snake) root.bind("lt;Keygt;", pos) snake() root.mainloop()