Функция tkinter after
делает две совершенно разные вещи - если вы называете это как в разделе, который вы помещаете между "" "" "":
master.after(500)
Это делает Ваша python программа ждет полсекунды, а затем продолжает.
Если вы называете это как ваш l oop in update_canvas
:
master.after(500, update_canvas)
затем он возвращает немедленно , без ожидания, но планирует update_canvas
, чтобы это произошло через полсекунды в будущем.
Таким образом, у вас есть версия выше с
while counter<10:
canvas.delete(rec)
rec = canvas.create_rectangle(x1+i*10,y1+i*10,x2+i*10,y2+i*10, width=0, fill="green")
counter +=1
master.after(500,update_canvas)
Не дает правильной временной задержки, поскольку l oop проходит все 10 итераций без ожидания и планирует update_canvas, чтобы происходить 10 раз, все через полсекунды с сейчас , а не с половиной секунды друг от друга.
Версия в кавычках:
for i in range(1,10):
master.after(500)
canvas.delete(rec)
rec = canvas.create_rectangle(x1+i*10,y1+i*10,x2+i*10,y2+i*10, width=0, fill="green")
Есть другая проблема - это запускает l oop несколько раз, и каждый раз ждет полсекунды, но окно еще даже не видно, так как вы не достигли master.mainloop()
- поэтому оно оживляет объект, но вы не можете пока что.
Чтобы исправить это, вам нужно использовать первую версию, которая запланирована на будущее, так что вы можете запланировать ее, а затем вызвать mainloop()
, а затем первую запланировать следующую.
Если мы сделаем это вместо:
def update_canvas():
global counter, rec # global lets you change counter and rec from inside the function - avoids 'Unbound local variable'
if counter >= 10:
return # If the counter is big enough, stop and do nothing more
else:
canvas.delete(rec) # Update the rectangle
i = counter
rec = canvas.create_rectangle(x1+i*10,y1+i*10,x2+i*10,y2+i*10, width=0, fill="green")
counter +=1 # Add to the counter so we don't animate forever
master.after(500,update_canvas) # Schedule the next update for half a second in the future
Тогда он должен оживить квадрат. Таким образом, l oop исчезает, но в первый раз, когда мы вызываем update_canvas
, сама функция update_canvas
просит tkinter вызвать ее позже. В конце концов счетчик становится достаточно большим, и он не запрашивает еще один вызов, и анимация останавливается.