Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос [Tkinter] Проблемы с увелечением?
@FlakeSunrise

В чем проблема цикла и библиотеки time?

Приветствую, недавно занялся задачей сделать цикл в Python, который каждую секунду будет уменьшать или увеличивать круг, но столкнулся с проблемой, что цикл выполняется очень быстро, пробовал воспользоваться time.sleep(), но код просто замирает, уже около недели пытаюсь найти решение.
import tkinter as tk
import time
root = tk.Tk()
canvas = tk.Canvas(root, width=2000, height=2000, borderwidth=0, highlightthickness=0, bg="black")
canvas.grid()

def _create_circle(self, x, y, r, **kwargs):
    return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle = _create_circle
def _create_circle_arc(self, x, y, r, **kwargs):
    if "start" in kwargs and "end" in kwargs:
        kwargs["extent"] = kwargs["end"] - kwargs["start"]
        del kwargs["end"]
    return self.create_arc(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle_arc = _create_circle_arc
for r in range(200, 100, -5):
	canvas.create_circle(725, 500, r, fill="blue", outline="red", width=4)
root.wm_title("Circles and Arcs")
root.mainloop()
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой
Решения вопроса 1
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
У 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()
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы