#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, ...)