如何取消选择 Tkinter ttk.Treeview 的一个或多个项目?

How to deselect an item (or items) of a Tkinter ttk.Treeview?

我在尝试从另一个小部件的回调中取消选择 Treeview 项目时遇到问题。我设法在 ESCAPE 上实现了一个有效的取消选择 press with:

tree.selection_remove(tree.focus())

在绑定到树视图对象本身的回调中。它仅在树视图具有焦点时才起作用(但没关系,这是一种期望的行为)。另一方面,尝试从另一个小部件的回调中进行相同的操作是行不通的。

我尝试使用:

tree.selection_clear()

如推荐的那样,但这也不起作用。

重要:使用 tree.selection_add(iid) 从同一调用中选择树视图中的项目是有效的。与操纵另一个小部件(一个组合框,执行调用的小部件是一个框架)相同。基于此,我不认为问题是由于我的代码中的一些愚蠢的错误(拼写错误或类似的错误)引起的。

我的理论失焦是一个问题,因为这是我看到的唯一区别,当相同的代码与 ESCAPE 一起工作时,而不是其他地方,所以我试图获得焦点使用 tree.focus_set()tree.focus_force(),但这并没有改变任何东西。

我不太明白 selection_clear() 应该做什么。由于 ttk.Treeviewttk.Misc 继承了此方法,因此相关文档很少。我在上面找不到任何东西 here or here。我唯一找到的是简洁的:

Clear the current X selection.

来自 Python shell 帮助(神秘的 X、坐标是什么?)

那么怎么实现这么看似简单的呢?请帮忙,我一时不知所措。

好的。所以答案是:

ttk.Treeview.selection()

它未在 the great New Mexico Tech resource, but it does get mentioned in the best tutorial out there and (of course) is in the docs 中列出。不知何故,它仍然逃脱了我。

现在,有了一种测试所选内容的方法很容易:

if len(tree.selection()) > 0:
    tree.selection_remove(tree.selection()[0])

怎么样:

for item in self.tree.selection():
   self.tree.selection_remove(item)

z33k 给出的答案帮助我得到了我需要的东西。但是如果选择了多个项目,它只会取消选择第一个。要取消选择我使用的当前选择的所有项目

此逻辑与 est.tenorio 相同,只是解释了它的作用。

取消选择所有项目

for i in tree.selection():
        tree.selection_remove(i)

如果你想一行完成。

tree.selection_remove(*tree.selection())