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

z33*_*33k 1 python treeview tkinter ttk

我在尝试Treeview从另一个小部件的回调中取消选择一个项目时遇到了麻烦。我设法在ESCAPE新闻界实施了一个有效的取消选择:

tree.selection_remove(tree.focus())
Run Code Online (Sandbox Code Playgroud)

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

我尝试使用:

tree.selection_clear()
Run Code Online (Sandbox Code Playgroud)

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

重要提示:从与tree.selection_add(iid)作品相同的调用中选择树视图中的项目。与操作另一个小部件(组合框,并且进行调用的小部件是一个框架)相同。基于此,我不认为问题是由于我的代码中的一些愚蠢的错误(错字或类似的东西)造成的。

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

我不太明白selection_clear()应该做什么。由于ttk.Treeviewttk.Misc有关此的文档中继承了此方法,因此很少使用。我在这里这里找不到任何关于它的东西。我发现的唯一一件事是简洁:

清除当前的 X 选择。

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

那么如何做到这么简单的事情呢?请帮忙,我不知所措。

z33*_*33k 5

好的。所以答案是:

ttk.Treeview.selection()
Run Code Online (Sandbox Code Playgroud)

它没有列在伟大的新墨西哥技术资源中,但它确实在那里的最佳教程中被提及,并且(当然)在文档中。不知怎的,它仍然逃过我的视线。

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

if len(tree.selection()) > 0:
    tree.selection_remove(tree.selection()[0])
Run Code Online (Sandbox Code Playgroud)


est*_*rio 5

关于什么:

for item in self.tree.selection():
   self.tree.selection_remove(item)
Run Code Online (Sandbox Code Playgroud)