gpt4 book ai didi

python - Tkinter treeview - 展开所有子节点

转载 作者:行者123 更新时间:2023-12-02 03:03:18 25 4
gpt4 key购买 nike

在 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 ,您可以绑定(bind)事件“<>”,该事件在所选节点展开之前立即生成。知道了这一点,我可以这样绑定(bind)事件:

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

最佳答案

你离解决方案不远了,缺少的是你需要在handleOpenEvent()中递归打开 child 的 child 。我的建议是编写一个单独的函数 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()

关于python - Tkinter treeview - 展开所有子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59594483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com