Tkinter 树视图 - 展开所有子节点

Posted

技术标签:

【中文标题】Tkinter 树视图 - 展开所有子节点【英文标题】:Tkinter treeview - Expand all child nodes 【发布时间】:2020-04-22 22:57:51 【问题描述】:

在 Python 3.7 中,我需要在打开节点时展开所有子节点。让我们使用以下示例:

A
--A.1
----A.1.1
--A.2
----A.2.1
----A.2.2
B
--B.1
----B.1.1
--B.2

在这个例子中,当 A 在 GUI 中展开时,A 的所有子节点也应该展开。

按照官方treeview documentation,可以绑定事件“”,该事件会在选中节点展开前立即生成。知道了这一点,我可以这样绑定事件:

tree.bind('<<TreeviewOpen>>', handleOpenEvent)

现在我可以编写一个方法来处理事件,使用来自this solution 的策略,如下所示:

def handleOpenEvent(event):
  tree.item(tree.focus(), open=True) # Tried with and without
  for child in tree.get_children(tree.focus()):
    tree.item(child, open=True)

无论我尝试什么,此代码都不会展开所选节点上的所有子节点。我已经尝试使它扩展 A 将扩展所有 B 节点,并且确实可以工作,但是当 A 扩展时我无法扩展所有 A 节点。似乎 Treeview 正在做一些我不知道的额外基础事情。有什么想法吗?

【问题讨论】:

【参考方案1】:

您离解决方案不远了,缺少的是您需要递归打开handleOpenEvent()中的孩子的孩子。我的建议是编写一个单独的函数open_children(parent) 以递归方式打开项目:

def open_children(parent):
    tree.item(parent, open=True)  # open parent
    for child in tree.get_children(parent):
        open_children(child)    # recursively open children

然后在handleOpenEvent()中使用:

def handleOpenEvent(event):
    open_children(tree.focus())

这里是完整的代码:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
tree = ttk.Treeview(root)
tree.pack()
tree.insert("", "end", "A", text="A")
tree.insert("", "end", "B", text="B")
tree.insert("A", "end", "A.1", text="A.1")
tree.insert("A.1", "end", "A.1.1", text="A.1.1")
tree.insert("A", "end", "A.2", text="A.2")
tree.insert("A.2", "end", "A.2.1", text="A.2.1")
tree.insert("A.2", "end", "A.2.2", text="A.2.2")
tree.insert("B", "end", "B.1", text="B.1")
tree.insert("B", "end", "B.2", text="B.2")
tree.insert("B.1", "end", "B.1.1", text="B.1.1")

def open_children(parent):
    tree.item(parent, open=True)
    for child in tree.get_children(parent):
        open_children(child)

def handleOpenEvent(event):
    open_children(tree.focus())

tree.bind('<<TreeviewOpen>>', handleOpenEvent)
root.mainloop()

【讨论】:

以上是关于Tkinter 树视图 - 展开所有子节点的主要内容,如果未能解决你的问题,请参考以下文章

ASP中关于TreeView控件的问题,怎样展开、收缩所有子节点?

WPF DataBound 树视图展开/折叠

EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中

数据结构-树:根节点子节点叶子节点是什么?

如何在kendo树视图中重新加载或刷新整个分支(父级+子级)

在tkinter的treeview中的for循环中的每个父节点下添加子节点