Tkinter Canvas 存储的项目被清除和召回
Tkinter Canvas items stored cleared and recalled
我是一个初学者,在 python 3.6 中使用 tkinter canvas 闲逛,并构建了一个使用省略号和随机方法随机生成太阳系的函数。
我希望能够保存这些项目及其所有属性,例如它们的标签和绑定,以便我可以清除 canvas 并绘制一个新的随机系统。如果需要,我想回到第一个生成的系统。
我不想将 canvas 保存为图像,因为我正在将项目绑定到函数。关于如何实现这一点有什么想法吗?
据我所知,您只能获取项目 "id" 作为该项目的句柄,虽然您可以删除具有给定 ID 的项目,但不能仅使用该 ID 重新创建它。
你可以做的是给所有这些元素一个共同的标签,并使用tag_lower
和tag_raise
来隐藏和显示下面和上面的项目"background" 窗格。对象仍在 canvas 上,但无法看到并且不会对例如鼠标事件。
import tkinter, random
root = tkinter.Tk()
canvas = tkinter.Canvas(root)
canvas.pack()
space = canvas.create_rectangle(0, 0, 200, 200, fill="#000000")
for _ in range(10):
x, y = random.randint(0, 200), random.randint(0, 200)
s = canvas.create_oval(x, y, x+10, y+10, fill="#ffff00", tags="star")
canvas.tag_bind(s, "<Button>", lambda e: print("twinkle"))
root.after(3000, lambda: canvas.tag_lower("star", space))
root.after(6000, lambda: canvas.tag_raise("star", space))
root.mainloop()
更新:根据 OP 的建议,还可以将项目的状态设置为 hidden
,这可能是更清晰的选项,不需要一些晦涩的 (-ing) 背景项目。
root.after(3000, lambda: canvas.itemconfig("star", state="hidden"))
root.after(6000, lambda: canvas.itemconfig("star", state="normal"))
我是一个初学者,在 python 3.6 中使用 tkinter canvas 闲逛,并构建了一个使用省略号和随机方法随机生成太阳系的函数。
我希望能够保存这些项目及其所有属性,例如它们的标签和绑定,以便我可以清除 canvas 并绘制一个新的随机系统。如果需要,我想回到第一个生成的系统。
我不想将 canvas 保存为图像,因为我正在将项目绑定到函数。关于如何实现这一点有什么想法吗?
据我所知,您只能获取项目 "id" 作为该项目的句柄,虽然您可以删除具有给定 ID 的项目,但不能仅使用该 ID 重新创建它。
你可以做的是给所有这些元素一个共同的标签,并使用tag_lower
和tag_raise
来隐藏和显示下面和上面的项目"background" 窗格。对象仍在 canvas 上,但无法看到并且不会对例如鼠标事件。
import tkinter, random
root = tkinter.Tk()
canvas = tkinter.Canvas(root)
canvas.pack()
space = canvas.create_rectangle(0, 0, 200, 200, fill="#000000")
for _ in range(10):
x, y = random.randint(0, 200), random.randint(0, 200)
s = canvas.create_oval(x, y, x+10, y+10, fill="#ffff00", tags="star")
canvas.tag_bind(s, "<Button>", lambda e: print("twinkle"))
root.after(3000, lambda: canvas.tag_lower("star", space))
root.after(6000, lambda: canvas.tag_raise("star", space))
root.mainloop()
更新:根据 OP hidden
,这可能是更清晰的选项,不需要一些晦涩的 (-ing) 背景项目。
root.after(3000, lambda: canvas.itemconfig("star", state="hidden"))
root.after(6000, lambda: canvas.itemconfig("star", state="normal"))