鉴于kivy doc中的Treeview示例,我正在寻找一种解决Treeview的方法。但我无法找到(无法设计)一个清晰简洁的解决方案,该解决方案也适用于嵌套级别超过3的树视图(我的试验包括不可维护的if-elif等决策树)。
因此,以下示例的反汇总应将Treeview转换为新的树字典,结果是新的树字典与示例中的树完全相同:
from kivy.app import App
from kivy.uix.treeview import TreeViewLabel, TreeView
from kivy.uix.floatlayout import FloatLayout
def populate_tree_view(tree_view, parent, node):
if parent is None:
tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
is_open=True))
else:
tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
is_open=True), parent)
for child_node in node['children']:
populate_tree_view(tree_view, tree_node, child_node)
tree = {'node_id': '1',
'children': [{'node_id': '1.1',
'children': [{'node_id': '1.1.1',
'children': [{'node_id': '1.1.1.1',
'children': []}]},
{'node_id': '1.1.2',
'children': []},
{'node_id': '1.1.3',
'children': []}]},
{'node_id': '1.2',
'children': []}]}
# EDIT
def treeToDict(node):
if isinstance(node, TreeView):
node = node.root
if node.text == 'Tree One':
node = node.nodes[0]
d = dict()
d['node_id'] = node.text
d['children'] = []
for child in node.nodes:
d['children'].append(treeToDict(child))
return d
# EDIT END
class TreeWidget(FloatLayout):
def __init__(self, **kwargs):
super(TreeWidget, self).__init__(**kwargs)
tv = TreeView(root_options=dict(text='Tree One'),
hide_root=False,
indent_level=4)
populate_tree_view(tv, None, tree)
self.add_widget(tv)
# EDIT
print treeToDict(tv)
class MyApp(App):
def build(self):
return TreeWidget()
if __name__ == '__main__':
MyApp().run()
修改:
随着人口减少,我并不意味着删除节点,而是在字典中转换树视图。原因如下。 我有一个内容编辑器构建建立对象的树视图。此对象结构需要以这样的方式存储在数据库中,以便使用populate_tree_view函数再次在编辑器中重现。
非常感谢您提前分享您的知识,时间和精力。
答案 0 :(得分:1)
不确定为什么人口减少的树应该是相同的,但这是一个简单的人口减少方法:
def depopulate(tv):
iterator = tv.iterate_all_nodes()
try:
while True:
node = iterator.next()
tv.remove_node(node)
except StopIteration:
return
这应该删除树中的所有节点,只留下根。
要创建节点字典,应使用以下方法:
def treeToDict(node):
if isinstance(node, TreeView):
node = node.root
if node.text == 'Tree One':
node = node.nodes[0]
d = dict()
d['node_id'] = node.text
d['children'] = []
for child in node.nodes:
d['children'].append(treeToDict(child))
return d
此方法中的初始if
语句只是跳过TreeView
小部件和根小部件(“Tree One”)。如果您确定可以使用顶级节点(node_id
== 1
)调用此方法,则可以删除这些if
语句。该方法返回dict。