如何使用.after与.create_rectangle?

时间:2016-12-01 18:57:30

标签: python tkinter tkinter-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和color变量的函数中,因此创建矩形的新函数将缺少必需的变量。我意识到我可以通过将我的整个函数嵌套在一个类中,然后从类中调用变量来解决这个问题,但是我想保持这个代码非常简单,我想知道是否有办法延迟创建矩形而不是使用一个类?

编辑:这:

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()

仍会返回AttributeError

1 个答案:

答案 0 :(得分:0)

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

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

如果您不想使用自行调用的函数,只需使用create_rectangle调用after方法:

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

有了这个,第一个将被立即绘制,下一个将在10毫秒,下一个将在20毫秒等等。