我在尝试从另一个小部件的回调中取消选择
Treeview
项目时遇到问题。我成功地在 ESCAPE 上实现了工作取消选择:
tree.selection_remove(tree.focus())
在绑定到树视图对象本身的回调中。它仅在树视图具有焦点时才起作用(但没关系,这是期望的行为)。另一方面,从另一个小部件的回调中尝试相同的操作是行不通的。
我尝试使用:
tree.selection_clear()
按照here的建议,但这也不起作用。
重要:使用
tree.selection_add(iid)
从同一个调用中选择树视图中的项目是有效的。与操作另一个小部件相同(一个组合框,执行调用的小部件是一个框架)。基于此,我不认为问题是由于我的代码中的一些愚蠢的错误(打字错误或类似的东西)造成的。
我的理论是失去焦点是一个问题,因为这是我在相同的代码与 ESCAPE 一起使用但在其他地方不起作用时看到的唯一区别,所以我尝试使用
tree.focus_set()
和 tree.focus_force()
来获得焦点,但这并没有不改变任何东西。
我不太明白
selection_clear()
应该做什么。由于 ttk.Treeview
从 ttk.Misc
继承了此方法,因此相关文档很少。我在这里或这里找不到任何东西。我唯一发现的是简洁的:
清除当前的 X 选择。
来自 Python shell 帮助(什么是神秘的
X
,坐标?)
那么看似简单的事情如何实现呢?请帮忙,我缺乏想法。
关于:
for item in self.tree.selection():
self.tree.selection_remove(item)
好的。所以答案是:
ttk.Treeview.selection()
它没有在伟大的新墨西哥科技资源中列出,但它确实在最好的教程中提到,并且(当然)在文档中。不知怎的,它仍然逃不过我的视线。
现在,有一种方法来测试选择的内容很容易:
if len(tree.selection()) > 0:
tree.selection_remove(tree.selection()[0])
z33k给出的答案帮助我得到了我需要的东西。 但如果选择了多个项目,则只会取消选择第一个项目。 要取消选择当前选择的所有项目,我使用了
这个逻辑与est.tenorio 相同,只是解释了它的作用。
取消选择所有项目
for i in tree.selection():
tree.selection_remove(i)
tree.selection_remove(*tree.selection())