Python 3.x 将tkinter.TreeView连接到Python3中的数据层

Python 3.x 将tkinter.TreeView连接到Python3中的数据层,python-3.x,tkinter,treeview,Python 3.x,Tkinter,Treeview,我有树状结构的数据。可以描述为以字典为元素的嵌套列表 #!/usr/bin/env python3 # -*- coding: utf-8 -*- from tkinter import * from tkinter import ttk root = Tk() # for this example the "hidden" column is not hidden tree = ttk.Treeview(root, columns=('datakey')) tree.pack() #

我有树状结构的数据。可以描述为以字典为元素的嵌套列表

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import *
from tkinter import ttk

root = Tk()

# for this example the "hidden" column is not hidden
tree = ttk.Treeview(root, columns=('datakey'))
tree.pack()

# the data (of a newsfeed reader aka newsaggregator)

theData = {
    "childs": [
        {
            "childs": [
                {
                    "childs": [
                        {
                            "htmlUrl": "http://www.news.org",
                            "text": "Newspaper",
                            "title": "Newspaper",
                            "type": "rss",
                            "xmlUrl": "http://www.news.org"
                        }
                    ],
                    "group": "News"
                },
                {
                    "htmlUrl": "https://www.theCinema.org",
                    "text": "Cinema",
                    "title": "Cinema",
                    "type": "atom",
                    "xmlUrl": "http://www.theCinema.org/newsfeed"
                }
            ],
            "group": "Group A"
        },
        {
            "htmlUrl": "http://www.top.org",
            "test": "Top Feed",
            "title": "Top Feed",
            "type": "rss",
            "xmlUrl": "http://www.top.org/feed"
        }
    ]
}

# populate the data into the tree
def _do_refresh_tree_level(data, parent_iid):
    nextParent_iid = parent_iid

    for key in data:
        if key == 'childs': # CHILDS
            # first create the group
            if 'group' in data.keys():
                nextParent_iid = tree.insert(parent=parent_iid,
                                             index=END,
                                             text=data['group'])
            # each child in the group
            idxCurChild = -1
            for child in data['childs']:
                idxCurChild += 1
                _do_refresh_tree_level(child, nextParent_iid)
        elif key == 'group': # GROUPS
            pass  # handled in CHILDS section
        else:  # FEED
            iid = tree.insert(parent_iid, index=END, text=data['title'])
            break

_do_refresh_tree_level(theData, '')

root.mainloop()

myData = [
            {
                "group": "A",
                "children": [
                    {
                        "name": "Tick"
                    },
                    {
                        "group": "B",
                        "children": [
                            {
                                "name": "Anna"
                            }
                        ]
                    }
                ]
            },
            {
                "name": "Bob"
            }
          ]
元素可以这样处理

theData['childs'][0]['group']  # "Group A"
要点是数据的结构和深度不是固定的

现在我想为数据结构中的所有元素提供键(如RDBMS中的主键或OODBMS中的对象id)。伪代码:

myIndex = {
        '100': ['childs'][0]['group'],
        ...
        }
这是不可能的,但解释了我的想法。这里的值可以描述为原始数据的地址。是否有一种pythonic方式来存储这些地址(而不是数据本身!)

因此,我想创建一个连接列表(
myIndex
,在下面的示例中),以将TreeView元素的id与有关在何处查找原始数据的信息结合起来

我可以将treeview元素id直接存储到数据结构中(
myData
)。但这并不优雅,在数据树中搜索当前id(例如,
TreeView
)时会浪费性能

第二点是,我的目标是将
TreeView
作为表示层中的GUI元素与
myData
作为数据层中的数据分开


可能的解决方案? 这行得通,但它是蟒蛇式的吗

myIndex = {
    '100': ['childs'][0]['group']
    }

def getitem(data, idx_list):
    if len(idx_list) > 1:
        idx = idx_list[0]
        idx_list = idx_list[1:]
        return getitem(data.__getitem__(idx), idx_list)
    else:
        return data.__getitem__(idx_list[0])

getitem(theData, myIndex['100']) # "Group A"

也许我的问题的根源是数据本身的结构?但是我想使用JSON,因为它很容易与Python一起使用,而且对于人类来说也很容易阅读。

“没有直接的方法将原始数据连接到树。”-当然有。在一个不可见的列中添加您想要的任何键。@buhtz:我不理解您的评论。您可以在不使用单个字符串的情况下返回原始列值。哦,好的。您希望单个列包含值列表。似乎需要为一行存储多个数据库键。对吗?这似乎很奇怪。如果您展示更多的工作代码,这将非常有帮助。例如,您所需的数据结构,以及足够的代码以树状视图的形式呈现,这样我们就可以可视化哪些是行,哪些是列,哪些需要ID与之关联,哪些不需要ID。我们不需要看到真实的示例,但我们需要看到准确的示例。如前所述,这个问题有点含糊。好吧,考虑到这个程序,您需要将id与哪些部分相关联?您的最终目标是能够双击“报纸”,并获得主键(或多个键?)?你如何决定关键是什么?