如何将.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 毫秒内绘制,依此类推
我正在尝试创建一个程序,一次在 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 毫秒内绘制,依此类推