簡體   English   中英

如何使用 time.sleep() 畫圓 Tkinter?

[英]How to use time.sleep() to draw circles Tkinter?

我編寫了一個程序來探索 Tkinter 並嘗試面向對象編程。 我的目標是畫同心圓,從外面開始,往里走。

繪圖工作正常,但我的圓圈之間的時間延遲不起作用。 我可以看到倒計時(使用print ),但在倒計時結束之前它不會繪制任何東西。

可能這與 object 的創建有關? 在 object 完成創建之前什么都沒有發生? 身份證。

這是我的代碼:

import tkinter as tk
import time

root = tk.Tk()

size = 1000
myCanvas = tk.Canvas(root, bg="white", height=size, width=size)

# draw circle
class Circle:

    def __init__(self, rt, dia, color, x=0, y=0):
        self.rt = rt
        self.dia = dia
        self.color = color
        self.x = x  # center cord x
        self.y = y  # center cord y

    def draw_circle(self):
        r = self.dia / 2
        up_left = (self.x - r, self.y + r)
        low_right = (self.x + r, self.y - r)
        cord = up_left + low_right
        self.rt.create_oval(cord, fill=self.color, outline="")


coord2 = 0, 300, 300, 0
#arc = myCanvas.create_oval(coord2, fill="blue")

def PickColor(r, g, b):
    r = r % 250
    g = g % 250
    b = b % 250
    return('#%02x%02x%02x' % (r, g, b))

class ConcentricCircles:

    def __init__(self, rt, quantity):
        self.rt = rt
        self.quantity = quantity

    def draw_circles(self):
        q = self.quantity
        circles = []
        i = 0
        for c in range(q, 1, -1):
            time.sleep(0.005)
            incr = size/(1.5*q-0.001*c*c*c)
            print(c)
            circles += [Circle(self.rt, incr*c, PickColor(110, 15*c^3-c^2, 300*c^5-c^4), size/2, size/2)]
            circles[i].draw_circle()
            i += 1
            self.rt.pack()

a = ConcentricCircles(myCanvas, 30).draw_circles()

root.mainloop()

這是它的畫法:

在此處輸入圖像描述

當您使用sleep() function 時,應用程序會暫停對 GUI 的更新。 這意味着畫圓也被暫停。 但是您可以強制應用程序在繼續使用update_idletasks()之前更新 GUI,請參見下面的示例。 我選擇在Circle.draw_circle() function 中進行更新:

def draw_circle(self):
    r = self.dia / 2
    up_left = (self.x - r, self.y + r)
    low_right = (self.x + r, self.y - r)
    cord = up_left + low_right
    self.rt.create_oval(cord, fill=self.color, outline="")
    self.rt.update_idletasks()  # Updates the canvas

當您使用sleep()時,應用程序一直處於忙碌狀態。 您可能想研究after() function 調度 function 調用但不鎖定應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM