如何解散Kivy Treeview?

时间:2018-03-29 13:32:45

标签: python-2.7 treeview kivy

鉴于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函数再次在编辑器中重现。

非常感谢您提前分享您的知识,时间和精力。

1 个答案:

答案 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。

相关问题