如何清空ttk.Treeview组件中的项?
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 上找到。