如何在不知道标签名称末尾的最后几个字符的情况下使用 find_withtag?

问题描述 投票:0回答:2

我在画布上有对象(使用 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 循环。

python tkinter tkinter-canvas
2个回答
1
投票

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)

这将找到画布中的所有标签,过滤以“食物”开头的标签,然后删除它们。


0
投票

你不能使用带有

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()
© www.soinside.com 2019 - 2024. All rights reserved.