Python将字典转换成树状的层次结构,并在tkin中显示

2024-10-01 11:25:23 发布

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

我有一本字典的格式是:

{
"filename":"file.txt",
"filesize":"500kb",
"maxcolwidth":{
    "col1":"300",
    "col2":"2",
    "col3":"3"},
"numberofcolumns":"3",
"datatypes":{
    "col1":"string",
    "col2":"int",
    "col3":"int"},
"rowcount":"400"
}

我目前正在使用tkinterforpython来构建GUI,但是找不到一种简单/优雅的方式来在tkintertreeview小部件或一个格式良好的字符串中显示下面的字典。我想要的输出是这样的:

^{pr2}$

或者更像一个层次树

Filename
    file.txt
Filesize
    500KB
Maxcolwidth
    col1
        300
    col2
        2
    col3
        3
Numberofcolumns
    3
Datatypes
    col1
        string
    col2
        int
    col3
        int
rowcount
    400

有什么想法吗?在

提前谢谢


Tags: txtstring字典格式filenamefilecol2col3
1条回答
网友
1楼 · 发布于 2024-10-01 11:25:23

解决方案是创建一个带有一个额外列的treeview,然后添加一个向树中添加项的函数。如果它是一个子元素,则通过字典的所有元素递归。在

下面是一个使用python2.x的简单示例。我不知道它是否符合你对“优雅”或“轻松”的定义。在

import Tkinter as tk
import ttk

DATA = {
    "filename":"file.txt",
    "filesize":"500kb",
    "maxcolwidth": {
        "col1":"300",
        "col2":"2",
        "col3":"3"
        },
    "numberofcolumns":"3",
    "datatypes": {
        "col1":"string",
        "col2":"int",
        "col3":"int"
        },
    "rowcount":"400"
    }

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.tree = ttk.Treeview(self, columns=("value",))
        self.vsb = ttk.Scrollbar(self, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.tree.pack(side="top", fill="both", expand=True)

        self.addNode(value=DATA, parentNode="")

    def addNode(self, value, parentNode="", key=None):
        if key is None:
            id = ""
        else:
            id = self.tree.insert(parentNode, "end", text=key)

        if isinstance(value, dict):
            self.tree.item(id, open=True)
            for (key, value) in value.iteritems():
                self.addNode(value, id, key)
        else:
            self.tree.item(id, values=(value,))

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

相关问题 更多 >