如何将.after 与.create_rectangle 一起使用?

How to use .after with .create_rectangle?

我正在尝试创建一个程序,一次在 canvas 上绘制矩形,我想使用 .after 函数来阻止它们被立即绘制(接近)。

目前我的(精简)代码如下所示:

root = Tk()
gui = ttk.Frame(root, height=1000, width=1000)
root.title("Test GUI")    

rgb_colour = "#%02x%02x%02x" % (0, 0, 255)

def func(*args):
    for item in sorted_list:
        canvas.create_rectangle(xpos, ypos, xpos+10, ypos+10, fill=rgb_colour)
        xpos += 10

canvas = Canvas(gui, width=1000, height=1000)
canvas.grid()

func()  # Code doesn't actually look exactly like this 

root.mainloop()

并且我希望在绘制的每个矩形之间有一个延迟。我已经收集到我应该做的事情:

def draw(*args):
    canvas.create_rectangle(xpos, ypos, xpos+10, ypos+10, fill=rgb_colour)

for item in sorted_list:
    root.after(10, draw)

但是我不能这样做,因为我原来的 for 循环嵌套在一个包含 xpos、ypos 和颜色变量的函数中,因此创建矩形的新函数将缺少所需的变量。我意识到我可以通过将我的整个函数嵌套在 class 中,然后从 class 中调用变量来解决这个问题,但是我想让这段代码非常简单,我想知道是否有办法在不使用 class?

的情况下延迟创建矩形

编辑:这个:

from tkinter import *

root = Tk()
canvas = Canvas(root, width=400, height=400, bg="white")
canvas.pack()

items = [1, 2, 3, 4, 5]
delay = 100

def draw_all(*args):
    global delay
    x, y = 0, 10
    for item in items:
        canvas.after(delay, canvas.create_rectangle(x, y, x+10, y+10, fill="red"))
        delay += 10
        x += 10

root.bind('<Return>', draw_all)
root.mainloop()

还是returns一个AttributeError

最简单的解决方案是创建一个函数,该函数获取项目列表及其所需的任何其他数据,从列表中弹出一个项目并创建矩形,然后调用自身直到没有更多项目。

def draw_one(items):
    item = items.pop()
    canvas.create_rectangle(...)
    if len(items) > 0:
        canvas.after(10, draw_one, items)

如果您不想使用调用自身的函数,只需使用 after:

调用 create_rectangle 方法
def draw_all():
    delay = 0
    for item in items:
        canvas.after(delay, canvas.create_rectangle, x0, y0, x1, y1, ...)
        delay += 10

这样,第一个会立即绘制,下一个在 10 毫秒内绘制,下一个在 20 毫秒内绘制,依此类推