Kivy - 树形视图
包括 Kivy 在内的大多数 GUI 工具包都提供了 TreeView 小部件,用户可以使用该小部件浏览和交互以树形格式呈现为节点的分层数据。操作系统的文件资源管理器中显示的文件和目录结构是 TreeView 的典型示例。
"kivy.uix.treeview"模块包含三个重要类的定义:TreeView、TreeViewNode 和 TreeViewLabel。这些类的对象构成了树形视图小部件。
TreeView 由 TreeViewNode 实例的实例填充。库中的任何小部件(例如标签或按钮)或用户定义的小部件对象都与 TreeViewNode 组合在一起。
树视图的根是 TreeView 对象本身。
from kivy.uix.treeview import TreeView tv = TreeView()
可在此根下直接添加一个或多个节点。TreeViewLabel 用作 add_node 方法的参数
from kivy.uix.treeview import TreeViewLabel n1 = tv.add_node(TreeViewLabel(text='node 1'))
您可以将节点添加到节点本身,而不是将其添加到树的根。将父节点的实例作为第二个参数提供给 add_node() 方法 −
n2 = tv.add_node(TreeViewLabel(text='Political Sci'), n1)
树视图的根窗口小部件默认打开,其默认标题为"Root"。要更改该设置,您可以使用 TreeView.root_options 属性。这会将选项传递给根窗口小部件 −
tv = TreeView(root_options=dict(text='My root'))
TreeViewLabel 本身是一个标签,因此无法生成任何事件作为 on_press。为此,您应该定义一个继承 TreeView 和 Button 的类。
class TreeViewButton(Button, TreeViewNode): pass
然后您可以处理不同的事件,例如 −
on_node_expand − 节点展开时触发
on_node_collapse − 节点折叠时触发
示例
下面给出的代码组成了大学每个院系可用科目的简单树形视图。垂直框布局包含一个树形视图小部件和一个按钮。树形视图的根是打开的。
要展开节点,请单击其左侧的">"按钮。它会变成向下的箭头。如果再次点击,该节点将被折叠。
from kivy.app import App from kivy.uix.treeview import TreeView, TreeViewLabel from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout from kivy.core.window import Window Window.size = (720, 350) class DemoApp(App): def build(self): lo = BoxLayout(orientation='vertical') self.tv = TreeView(root_options={ 'text': 'Faculty-wise Subjects', 'font_size': 20} ) self.n1 = self.tv.add_node(TreeViewLabel(text='Arts')) self.n2 = self.tv.add_node(TreeViewLabel(text='Commerce')) self.n3 = self.tv.add_node(TreeViewLabel(text='Science')) self.n4 = self.tv.add_node( TreeViewLabel(text='Sociology'), self.n1 ) self.n5 = self.tv.add_node( TreeViewLabel(text='History'), self.n1 ) self.n6 = self.tv.add_node( TreeViewLabel(text='Political Sci'), self.n1 ) self.n7 = self.tv.add_node( TreeViewLabel(text='Accountancy'), self.n2 ) self.n8 = self.tv.add_node( TreeViewLabel(text='Secretarial Practice'), self.n2 ) self.n9 = self.tv.add_node( TreeViewLabel(text='Economics'), self.n2 ) self.n10 = self.tv.add_node( TreeViewLabel(text='Physics'), self.n3 ) self.n11 = self.tv.add_node( TreeViewLabel(text='Mathematics'), self.n3 ) self.n12 = self.tv.add_node( TreeViewLabel(text='Chemistry'), self.n3 ) lo.add_widget(self.tv) return lo DemoApp().run()