如何清空ttk.Treeview组件中的项?

6 投票
2 回答
13811 浏览
提问于 2025-04-17 10:04
ing_scroll = Scrollbar(window1_frame1, orient=VERTICAL)
ingredients = ttk.Treeview(window1_frame1, yscrollcommand=ing_scroll.set, height=5, columns=['Ingredient', 'Amount'], show="headings")
ingredients.heading("Ingredient", text='Ingredient')
ingredients.column("Ingredient", width=7)
ingredients.heading("Amount", text='Amount')
ingredients.column("Amount", width=1)
ing_scroll.config(command=ingredients.yview)
ing_scroll.pack(side=RIGHT, fill=Y)
ingredients.pack(side=LEFT, fill='both', expand=1)

def OnRecpSelect(event):
    DB = menu_combo.get()
    mytable = recipe_combo.get()
    ingredient_list = TKengine.pull_ingredients(DB, mytable)
    # NEED TO CLEAR THE INGREDIENTS TTK:TREEVIEW OBJECT HERE!
    for i in ingredient_list: 
        ingre = i[1]
        amoun = i[2]
        value = ingre,amoun
        ingredients.insert('',0,values=value)

ingredient_list 是一个列表,里面显示的内容像是... ('糖', '1杯') 之类的。这个函数是为了一个下拉框(combobox)而写的,所以我希望树形视图(treeview)能清空,而不是一直往里添加更多的成分。不幸的是,我没有找到一个 clear() 方法。

如果有一种编程的方法可以先识别出里面有什么(比如计算一下行数就不错...)这让我很头疼。我在文档中注意到可以使用删除方法,但它需要知道要删除的具体项目... 如果我使用:

ingredients.delete('',0)

我得到的结果是

TclError: Item 0 not found

所以我猜它想要像 '糖' 这样的项目...

当然,这就成了一个两难的情况,因为如果你选择了下拉框并想清空成分的树形视图,实际上每个食谱里的成分项目并不相同,那我们怎么知道要删除哪些项目呢?...

如果你需要更多细节,请告诉我... 我对树形视图对象还比较陌生,但这让我想干脆在画布上用两个列表框。

2 个回答

8

为了让代码看起来更简洁、更符合Python的风格:

map(ingredients.delete, ingredients.get_children())
5

当你在树形结构中插入一个项目时,insert 方法会返回一个项目的 ID。这就是你在删除项目时需要用到的。

另外,给定一个项目 ID(比如根项目),你可以使用 get_children 方法获取它所有子项目的列表。如果你不传任何参数给 get_children,它会返回所有属于根元素的项目列表。然后你可以遍历这个列表来删除这些项目。

这些内容都有详细的说明,可以在 treeview 文档docs.python.org 上找到。

撰写回答