树视图

_images/treeview.png

在 1.0.4 版本加入.

TreeView 是一个用于表示树形结构的控件。目前它非常基础,仅支持最少的功能集。

介绍

:一个 TreeViewTreeViewNode 实例填充,但你不能直接使用 TreeViewNode。你必须将其与另一个控件结合,例如 LabelButton 甚至是你自己的控件。TreeView 总是基于 TreeViewLabel 创建一个默认的根节点。

TreeViewNode 是一个类对象,包含作为树节点所需的属性。扩展 TreeViewNode 以创建自定义节点类型,供 TreeView 使用。

要构建你自己的子类,请遵循TreeViewLabel的模式,它结合了一个Label和一个TreeViewNode,生成一个:class:TreeViewLabel,可直接用于TreeView实例中。

要使用TreeViewLabel类,你可以创建两个直接连接到根节点的节点:

tv = TreeView()
tv.add_node(TreeViewLabel(text='My first item'))
tv.add_node(TreeViewLabel(text='My second item'))

或者,创建两个节点附加到第一个节点上:

tv = TreeView()
n1 = tv.add_node(TreeViewLabel(text='Item 1'))
tv.add_node(TreeViewLabel(text='SubItem 1'), n1)
tv.add_node(TreeViewLabel(text='SubItem 2'), n1)

如果你有一个大型的树形结构,或许需要一个工具函数来填充树视图::

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': []}]}


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)

树视图中的根部件默认是展开的,其文本设置为“Root”。如果您想更改这一点,可以使用 TreeView.root_options 属性。这将向根部件传递选项,例如:

tv = TreeView(root_options=dict(text='My root label'))

创建你自己的节点部件

对于按钮节点类型,将 ButtonTreeViewNode 结合如下:

class TreeViewButton(Button, TreeViewNode):
    pass

你必须知道,对于给定的节点,只有 size_hint_x 会被尊重。该节点分配到的宽度将取决于 TreeView 的当前宽度以及节点的层级。例如,如果一个节点位于第4层,那么分配到的宽度将是:

treeview.width - treeview.indent_start - treeview.indent_level * node.level

你可能会在这方面遇到一些麻烦。如果需要的话,开发者有责任正确处理图形表示节点的适配。

class kivy.uix.treeview.TreeView(**kwargs)[源代码]

基类:Widget

TreeView 类。更多信息请参阅模块文档。

事件:
on_node_expand: (node, )

当节点正在展开时触发。

on_node_collapse: (node, )

当节点正在被折叠时触发。

add_node(node, parent=None)[源代码]

向树中添加一个新节点。

参数:
node:一个 TreeViewNode 的实例。

要添加到树中的节点

parent:一个 TreeViewNode 的实例,默认为 None。

父节点,用于挂载新节点。若为 None,则将其添加到 root 节点下。

返回:

节点 node

deselect_node(*args)[源代码]

取消选择任何已选中的节点。

在 1.10.0 版本加入.

get_node_at_pos(pos)[源代码]

获取位于位置 (x, y) 处的节点。

hide_root

使用此属性来显示/隐藏初始根节点。如果为True,根节点将显示为闭合节点。

hide_root 是一个 BooleanProperty,默认值为 False。

indent_level

用于除第一级外每一级缩进的宽度。

树中每一层缩进的计算方式如下:

indent = indent_start + level * indent_level

indent_level 是一个 NumericProperty,默认值为 16。

indent_start

级别0/根节点的缩进宽度。这主要是为了容纳树形图标(折叠/展开)而设置的初始大小。关于级别缩进计算的更多信息,请参阅 indent_level

indent_start 是一个 NumericProperty,默认值为 24。

iterate_all_nodes(node=None)[源代码]

用于从`node`开始向下遍历所有节点的生成器,无论节点是否展开。如果`node`为`None`,则生成器从 root 开始。

iterate_open_nodes(node=None)[源代码]

node 开始向下遍历所有展开节点的生成器。如果 nodeNone,则生成器从 root 开始。

要获取所有打开的节点:

treeview = TreeView()
# ... add nodes ...
for node in treeview.iterate_open_nodes():
    print(node)
load_func

用于异步加载的回调函数。若设置此回调,将自动进行异步加载。该回调必须作为Python生成器函数使用,通过yield将数据发送回树视图。

回调函数应采用以下格式:

def callback(treeview, node):
    for name in ('Item 1', 'Item 2'):
        yield TreeViewLabel(text=name)

load_func 是一个 ObjectProperty,默认值为 None。

minimum_height

包含所有子部件所需的最小高度。

在 1.0.9 版本加入.

minimum_height 是一个 NumericProperty,默认值为 0。

minimum_size

包含所有子部件所需的最小尺寸。

在 1.0.9 版本加入.

minimum_size 是 (minimum_width, minimum_height) 属性的 ReferenceListProperty

minimum_width

包含所有子部件所需的最小宽度。

在 1.0.9 版本加入.

minimum_width 是一个 NumericProperty,默认值为 0。

on_touch_down(touch)[源代码]

接收触摸按下事件。

参数:
touchMotionEvent

收到触摸事件。该触摸位于父级坐标系中。关于坐标系统的讨论,请参阅 relativelayout

返回:

bool 如果为 True,触摸事件的派发将停止。如果为 False,事件将继续派发给控件树中的其余部分。

remove_node(node)[源代码]

从树中移除一个节点。

在 1.0.7 版本加入.

参数:
node:一个 TreeViewNode 的实例。

要从树中移除的节点。如果 noderoot,则不会将其移除。

root

根节点。

默认情况下,根节点控件是一个带有文本“Root”的 TreeViewLabel。如果您想更改传递给控件创建的默认选项,请使用 root_options 属性:

treeview = TreeView(root_options={
    'text': 'Root directory',
    'font_size': 15})

root_options 将改变 TreeViewLabel 实例的属性。然而,目前您还不能更改用于根节点的类。

root 是一个 AliasProperty,默认值为 None。它是只读的。然而,控件的内容可以被更改。

root_options

传递给根组件的默认根选项。有关root_options用法的更多信息,请参阅:attr:`root`属性。

root_options 是一个 ObjectProperty,默认值为 {}。

select_node(node)[源代码]

在树中选择一个节点。

selected_node

TreeView.select_node() 或触摸选中的节点。

selected_node 是一个 AliasProperty,默认值为 None。它是只读的。

toggle_node(node)[源代码]

切换节点的状态(展开/折叠)。

exception kivy.uix.treeview.TreeViewException[源代码]

基类:Exception

TreeView 中错误的异常。

class kivy.uix.treeview.TreeViewLabel(**kwargs)[源代码]

基类:Label, TreeViewNode

LabelTreeViewNode 结合,创建一个 TreeViewLabel,可用作树中的文本节点。

更多信息请参阅模块文档。

class kivy.uix.treeview.TreeViewNode(**kwargs)[源代码]

基类:object

TreeViewNode类,用于为TreeView对象构建节点类。

color_selected

节点被选中时的背景颜色。

color_selected 是一个 ColorProperty,默认值为 [.1, .1, .1, 1]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty

even_color

偶数节点在未选中时的背景颜色。

bg_color 是一个 ColorProperty,默认值为 [.5, .5, .5, .1]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty

is_leaf

布尔值,指示此节点是否为叶节点。用于调整图形表示。

is_leaf 是一个 BooleanProperty,默认值为 True。当添加子节点时,它会自动设置为 False。

is_loaded

布尔值,用于指示此节点是否已加载。此属性仅在 TreeView 使用异步加载时使用。

is_loaded 是一个 BooleanProperty,默认值为 False。

is_open

布尔值,用于指示此节点是否已展开(当存在子节点时)。该属性用于调整图形表示。

警告

该属性由 TreeView 自动设置。您可以读取它,但不能写入。

is_open 是一个 BooleanProperty,默认值为 False。

is_selected

布尔值,用于指示此节点是否被选中。该值用于调整图形表示。

警告

该属性由 TreeView 自动设置。您可以读取它,但不能写入。

is_selected 是一个 BooleanProperty,默认值为 False。

level

节点的层级。

level 是一个 NumericProperty,默认值为 -1。

no_selection
用于指示是否允许选择节点的布尔值。

不是。

no_selection 是一个 BooleanProperty,默认值为 False。

nodes

节点列表。节点列表与子控件列表不同。节点列表中的节点代表树上的一个节点。子控件列表中的条目代表与该节点关联的控件。

警告

该属性由 TreeView 自动设置。您可以读取它,但不能写入。

nodes 是一个 ListProperty,默认值为 []。

odd

该属性由TreeView控件自动设置,且为只读。

odd 是一个 BooleanProperty,默认值为 False。

odd_color

奇数节点在未选中时的背景颜色。

odd_color 是一个 ColorProperty,默认值为 [1., 1., 1., 0.]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty

parent_node

父节点。该属性是必需的,因为当节点未显示时,parent 可能为 None。

在 1.0.7 版本加入.

parent_node 是一个 ObjectProperty,默认值为 None。