目录
- 树视图
- 介绍
- 创建你自己的节点部件
TreeViewTreeView.add_node()TreeView.deselect_node()TreeView.get_node_at_pos()TreeView.hide_rootTreeView.indent_levelTreeView.indent_startTreeView.iterate_all_nodes()TreeView.iterate_open_nodes()TreeView.load_funcTreeView.minimum_heightTreeView.minimum_sizeTreeView.minimum_widthTreeView.on_touch_down()TreeView.remove_node()TreeView.rootTreeView.root_optionsTreeView.select_node()TreeView.selected_nodeTreeView.toggle_node()
TreeViewExceptionTreeViewLabelTreeViewNode
树视图¶
在 1.0.4 版本加入.
TreeView 是一个用于表示树形结构的控件。目前它非常基础,仅支持最少的功能集。
介绍¶
:一个 TreeView 由 TreeViewNode 实例填充,但你不能直接使用 TreeViewNode。你必须将其与另一个控件结合,例如 Label、Button 甚至是你自己的控件。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'))
创建你自己的节点部件¶
对于按钮节点类型,将 Button 和 TreeViewNode 结合如下:
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)[源代码]¶
基类:
WidgetTreeView 类。更多信息请参阅模块文档。
- 事件:
- on_node_expand: (node, )
当节点正在展开时触发。
- on_node_collapse: (node, )
当节点正在被折叠时触发。
- add_node(node, parent=None)[源代码]¶
向树中添加一个新节点。
- 参数:
- node:一个
TreeViewNode的实例。 要添加到树中的节点
- parent:一个
TreeViewNode的实例,默认为 None。 父节点,用于挂载新节点。若为 None,则将其添加到
root节点下。
- node:一个
- 返回:
节点 node。
- 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_open_nodes(node=None)[源代码]¶
从 node 开始向下遍历所有展开节点的生成器。如果 node 为 None,则生成器从
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)[源代码]¶
接收触摸按下事件。
- 参数:
- touch:
MotionEvent类 收到触摸事件。该触摸位于父级坐标系中。关于坐标系统的讨论,请参阅
relativelayout。
- touch:
- 返回:
bool 如果为 True,触摸事件的派发将停止。如果为 False,事件将继续派发给控件树中的其余部分。
- remove_node(node)[源代码]¶
从树中移除一个节点。
在 1.0.7 版本加入.
- 参数:
- node:一个
TreeViewNode的实例。 要从树中移除的节点。如果 node 是
root,则不会将其移除。
- node:一个
- 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,默认值为 {}。
- selected_node¶
由
TreeView.select_node()或触摸选中的节点。selected_node是一个AliasProperty,默认值为 None。它是只读的。
- class kivy.uix.treeview.TreeViewLabel(**kwargs)[源代码]¶
基类:
Label,TreeViewNode将
Label与TreeViewNode结合,创建一个TreeViewLabel,可用作树中的文本节点。更多信息请参阅模块文档。
- class kivy.uix.treeview.TreeViewNode(**kwargs)[源代码]¶
基类:
objectTreeViewNode类,用于为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。