Не удается реализовать гравитацию (или механизм перехода) в игре python tkinter

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

Я пытаюсь сделать так, чтобы, когда пользователь нажимает стрелку вверх, она подпрыгивала, а затем падала обратно. В имеющейся у меня программе кажется, что она поднимается и опускается без отображения позиций, поэтому, похоже, она остается на месте. Кто-нибудь знает, почему это происходит?

 if self.direction == 4 and self.y>0: # move up
    self.y = self.y - 6
    self.canvas.coords(self.circle, self.x, self.y, self.x 10, self.y 10)
    self.y = self.y   6
    self.canvas.coords(self.circle, self.x, self.y, self.x 10, self.y 10)
  

Ответ №1:

Полное перемещение происходит до того, как экран может быть перерисован.

Добавьте задержку с помощью after функции.

 if self.direction == 4 and self.y>0: # move up
    self.y = self.y - 6
    self.canvas.coords(self.circle, self.x, self.y, self.x 10, self.y 10)
    self.y = self.y   6
    # wait 1/2 second
    root.after(500, lambda : self.canvas.coords(self.circle, self.x, self.y, self.x 10, self.y 10))
  

Для полноты картины приведем обновление, предложенное @Oakley. Лямбда не требуется.

root.after(500, self.canvas.coords, self.circle, self.x, self.y, self.x 10, self.y 10 )

Комментарии:

1. Отлично, спасибо. Является ли значение 500, лямбда, определяющим длительность задержки?

2. @Будет его в миллисекундах, так что 1000 — это 1000 мс, что составляет 1 секунду и так далее .. и lambda для вызова функции, например after(ms,func)

3. Вам не нужно использовать lambda здесь. Вы можете передавать аргументы функциям, вызываемым после: root.after(500, self.canvas,coords, self.circle, self.x, ...)