从嵌套字典创建tkinter嵌套树视图

时间:2019-07-15 09:07:25

标签: python recursion tkinter nested treeview

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

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()

1 个答案:

答案 0 :(得分:0)

我知道了:

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()