Kivy 简明教程
Kivy - Tree View
大多数 GUI 工具包(包括 Kivy)提供一个 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 − 当节点正在收缩时触发
Example
下面给出的代码组合了一个简单的树视图,其中包含大学每个院系提供的科目。垂直盒布局包含一个 treeview 小组件和一个按钮。树视图的根节点是打开的。
要展开节点,请单击其左边的“>”按钮。它会变成一个向下箭头。如果再次单击,节点将收缩。
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()