Tkinter treeview展开所有子节点

2024-06-16 06:41:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在本例中,当在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正在做一些我不知道的额外的底层事情。有什么想法吗


Tags: childtruetree示例节点官方documentation事件
1条回答
网友
1楼 · 发布于 2024-06-16 06:41:17

您离解决方案不远,缺少的是您需要递归地打开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()

相关问题 更多 >