Jos*_*osh 4 python treeview tkinter
在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
Run Code Online (Sandbox Code Playgroud)
在这个例子中,当 A 在 GUI 中展开时,A 的所有子节点也应该展开。
根据官方树视图文档,您可以绑定事件“<>”,该事件在所选节点展开之前立即生成。知道了这一点,我可以这样绑定事件:
tree.bind('<<TreeviewOpen>>', handleOpenEvent)
现在我可以编写一个方法来处理该事件,使用此解决方案中的策略,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,此代码都不会展开所选节点上的所有子节点。我尝试过使其扩展 A 将扩展所有 B 节点,这确实有效,但是当 A 扩展时我无法扩展所有 A 节点。似乎 Treeview 正在做一些我不知道的额外的底层事情。有什么想法吗?
您距离解决方案并不遥远,缺少的是您需要递归地打开 中子级的子级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
Run Code Online (Sandbox Code Playgroud)
然后将其用于handleOpenEvent():
def handleOpenEvent(event):
open_children(tree.focus())
Run Code Online (Sandbox Code Playgroud)
这是完整的代码:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8174 次 |
| 最近记录: |