我正在尝试创建一个一次在画布上绘制矩形的程序,我想使用.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
答案 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毫秒等等。