我在画布上有对象(使用 Tkinker)代表“食物”。我想删除该对象的所有实例,但它们的标签都在末尾包含一个数字(Food0、Food1、Food2 等)。我如何在不知道标签末尾的数字的情况下删除该类类型的所有对象?
food_tags = canvas.find_withtag('Food*')
# Find all tags starting with 'Food'
print(food_tags)
for tag in food_tags:
print(tag)
canvas.delete(tag)
对象名称是: 食物0 食物1 食物2 美食3 等等
Canvas.find_withtag('Food*') 返回一个空列表,因此永远不会进入 for 循环。
find_withtag
方法不支持通配符或模式匹配,因此 find_withtag('Food*')
不会按预期工作。
一种解决方案是使用lambda函数过滤以'Food'开头的标签,然后将其删除。这是一个示例代码片段:
food_tags = filter(lambda tag: tag.startswith('Food'), canvas.find_all())
for tag in food_tags:
canvas.delete(tag)
这将找到画布中的所有标签,过滤以“食物”开头的标签,然后删除它们。
你不能使用带有
find_withtag
的模式。但是,物品可以有多个标签。我的建议是像您现在所做的那样为每个项目提供唯一标签,然后再添加一个代表组的标签。例如,您可以做tags=("Food1", "Food")
。然后您可以搜索Food
,它会找到所有带有该标签的项目。
import tkinter as tk
import random
root = tk.Tk()
canvas = tk.Canvas(root, bg="bisque", width=400, height=400)
canvas.pack(fill="both", expand=True)
for i in range(1,11):
canvas.create_text(10, i*20, text=f"Food{i}", anchor="nw", tags=(f"Food{i}", "Food"))
for i in range(1,11):
canvas.create_text(100, i*20, text=f"Music{i}", anchor="nw", tags=(f"Music{i}", "Music"))
assert(canvas.find_withtag("Food") == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
assert(canvas.find_withtag("Music") == (11, 12, 13, 14, 15, 16, 17, 18, 19, 20))
root.mainloop()