前
tkinter的确算是比较老了,不可以用json直接生成treeview。那么动手自己搞一个吧。目标是类似这样子的:
json格式化
语法
先看treeview 的相关基础, 这个网站里面就很不错了。
treeview的基本例子
当然, 也要结合一下官方的文档
treeview官方文档
可以看到,我们需要指定一个treeview的parent,即父节点, 以及一个index即插入位置。其他都是可选参数。当然,我们要指定显示的文本,即text。由于我们要建立的是一个树状控件。所以我们并不需要heading,也不需要各个列的值。
建立控件
tree = ttk.Treeview(self, height=28, show='tree')
填充tree
def populate_treeview(tree, parent, node):
"""
Populate tree view by given json object.
:param tree: treeview widget.
:param parent: parent node of treeview.
:param node: node should be a dict object.
:return:
"""
# 如果没有父节点,建立一个父节点
if parent is None:
parent = tree.insert('', 'end', text='Json')
# 由于node一定是dict,直接迭代
for item in node:
value = node.get(item)
if isinstance(value, dict):
cur = tree.insert(parent, 'end', text=str(item), values=(str(value).replace("'", '"'), type(value).__name__))
populate_treeview(tree, cur, value)
elif isinstance(value, list):
cur = tree.insert(parent, 'end', text=item, values=(str(value).replace("'", '"'), type(value).__name__))
for each in value:
if isinstance(each, dict):
tmp = tree.insert(cur, 'end', text='{}')
populate_treeview(tree, tmp, each)
else:
tree.insert(cur, 'end', text=str(each), values=(str(value).replace("'", '"'), type(value).__name__))
elif isinstance(value, int) or isinstance(value, str) or isinstance(value, bool):
# tmp = str(item) + ':' + str(value)
tmp = str(item)
tree.insert(parent, 'end', text=tmp, values=(str(value).replace("'", '"'), type(value).__name__))
网友评论