首页 > 解决方案 > 从嵌套字典创建 tkinter 嵌套树视图

问题描述

我有一个像这样的嵌套字典,我想用它来填充分层树视图。

hierarchy = {
                'a': {
                    'b': {
                        'e': 'DATA',
                        'f': 'DATA',
                        'g': {
                            'h': 'DATA',
                            'i': 'DATA',
                            'j': 'DATA'
                        },
                        'm': {
                            'n': 'DATA',
                            'o': 'DATA',
                            'p': 'DATA'
                        }
                    },
                    'c': 'DATA',
                    'd': 'DATA'
                }
            }

代码应该遍历嵌套字典并创建适当的 tk 树视图节点。基本上复制了 PyCharm 的视图,让您可以打开嵌套字典并根据需要向下钻取。

我正在粘贴我在下面编写的代码,但递归根本不起作用。我只是为了方便而不必重新创建 tk 窗口等而粘贴它。

root = tk.Tk()
root.geometry("900x900")
tree = ttk.Treeview(root)
ttk.Style().configure('Treeview', rowheight=30)
tree["columns"] = ("one", "two", 'three')
tree.column("one", width=100)
tree.column("two", width=100)
tree.heading("one", text="a")
tree.heading("two", text="b")
tree.heading("three", text="c")

nodes = {}

def add_node(elem):
    for i, j in elem.items():
        if isinstance(j, dict):
            add_node(j)
        else:
            if i in nodes.keys():
                nodes[j] = tree.insert(i, 1, j, text=j)
            else:
                nodes[i] = tree.insert("", 1, i, text=i)

for k, v in hierarchy.items():
    add_node(k)

tree.pack(expand=True, fill='both')
root.mainloop()
root.destroy()

标签: pythonrecursiontkinternestedtreeview

解决方案


我想到了:

root = tk.Tk()
root.geometry("900x900")
tree = ttk.Treeview(root)
ttk.Style().configure('Treeview', rowheight=30)
tree["columns"] = ("one", "two", 'three')
tree.column("one", width=100)
tree.column("two", width=100)
tree.heading("one", text="a")
tree.heading("two", text="b")
tree.heading("three", text="c")

def add_node(k, v):
    for i, j in v.items():
        tree.insert(k, 1, i, text=i)
        if isinstance(j, dict):
            add_node(i, j)

for k, v in hierarchy.items():
    tree.insert("", 1, k, text=k)
    add_node(k, v)

tree.pack(expand=True, fill='both')
root.mainloop()

推荐阅读