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与哪些部分相关联?您的最终目标是能够双击“报纸”,并获得主键(或多个键?)?你如何决定关键是什么?