У Tkinter есть некий аналог sleep -
after, по истечению заданного времени он вызывает нужную функцию.
Но в твоем случае это бесполезно, потому что ты сначала выполняешь создание объекта, а только затем запускаешь само окно. Ты можешь сделать так:
for r in range(200, 100, -5):
print(r)
canvas.create_circle(725, 500, r, fill="blue", outline="red", width=4)
root.wm_title("Circles and Arcs")
print(True)
root.mainloop()
Как видишь
mainloop
не запущен, но выполнение функции
canvas.create_circle
все равно произошло и только потом в консоле отобразится
True
и прозойдет запуск
mainloop
Хочешь отрисовывать динамично? Тогда как вариант запускать отрисовку можно в отдельном потоке, а уже там хоть
time.sleep
пихать, вот пример на твоей задаче:
import tkinter as tk
from threading import Thread
from time import sleep
class CreateCircle(tk.Tk):
def __init__(self, width=1000, height=1000, borderwidth=0, highlightthickness=0, bg='black'):
tk.Tk.__init__(self)
self.canvas = tk.Canvas(
self, width=width, height=height, borderwidth=borderwidth,
highlightthickness=highlightthickness, bg=bg
)
self.create_circle_thread = Thread(target=self.create_circle)
self.create_circle_thread.start()
self.canvas.pack()
self.run()
def create_circle(self, x=725, y=500, fill='blue', outline='red', width=4):
for r in range(200, 100, -5):
self.__create_circle(x, y, r, fill=fill, outline=outline, width=width)
sleep(0.2)
def __create_circle(self, x, y, r, **kwargs):
return self.canvas.create_oval(x-r, y-r, x+r, y+r, **kwargs)
def run(self):
self.mainloop()
cc = CreateCircle()