Kivy 简明教程
Kivy - ScrollView
Kivy 框架中的 ScrollView 小部件将尺寸大于分配给它的尺寸的任何其他小部件包裹起来,并向其提供一个可滚动的面板。这样,可以纵向或横向平移/滚动包裹的小部件。
ScrollView 类在 kivy.uix.scrollview 模块中进行定义。您通常在一个布局中组合一个或多个小部件,并将该布局添加到 ScrollView。
from kivy.uix.scrollview import ScrollView
view = ScrollView()
view.add_widget(layout)
ScrollView 对象的 “scroll_x” 和 “scroll_y” 属性控制滚动面板的滚动行为。Scrollview 允许双向滚动。您可以通过将 “do_scroll_x” 或 “do_scroll_y” 设置为 False 来禁用某个轴。
此外,“scroll_distance” 属性设置要移动的最小距离,默认为 20 像素。另外,scroll_timeout 属性指定最大时间段,默认为 55 毫秒。
“scroll_distance” 和 “scroll_timeout” 的重要性在于:如果通过触摸手势滚动的像素数多于或等于 scroll_distance,并且在 scroll_timeout 时间段内,它将被识别为滚动手势并将开始平移(滚动/平移)。如果发生超时,则触摸按下事件将传播到子级。
ScrollView 类的其他属性如下所示 −
-
do_scroll − 允许在 X 或 Y 轴上滚动。
-
do_scroll_x − 允许在 X 轴上滚动。这是一个 BooleanProperty,默认为 True。
-
do_scroll_y − 允许在 Y 轴上滚动。这是一个 BooleanProperty,默认为 True。
-
scroll_distance − 开始滚动 ScrollView 之前滚动的距离(以像素为单位)。这是一个数字属性,且默认值为 20 像素。
-
scroll_timeout − 允许触发 scroll_distance 的超时(以毫秒为单位),默认值为 55 毫秒。
-
scroll_to() − 滚动视区以确保给定小组件可见,可以选择使用填充和动画。
-
scroll_type − 设置用于 scrollview 中内容滚动的类型。可选的选项有:['content'], ['bars'], ['bars', 'content']。
-
ScrollView 对象发出以下事件 − on_scroll_start − 当从触控开始滚动时触发的通用事件。 on_scroll_move − 当滚动从触控移动时触发的通用事件。 on_scroll_stop − 当从触控停止滚动时触发的通用事件。
Example
为了能够理解 ScrollView 的运行机制,我们需要一个足够大的布局,方式可以溢出主应用程序窗口的尺寸。为此,我们向一列网格布局中添加 100 个按钮,并应用 scrollview 到它。
以下示例中的操作码如下:
layout = GridLayout(cols=1)
for i in range(100):
btn = Button(text='Button ' + str(i), size_hint_y=None, height=40)
layout.add_widget(btn)
root = ScrollView()
root.add_widget(layout)
为了确保高度能够滚动,将布局对象的 minimum_height 属性绑定到其 setter。
layout.bind(minimum_height=layout.setter('height'))
以下为 ScrollView 示例代码的完整代码:
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.app import App
from kivy.core.window import Window
Window.size = (720, 350)
class scrollableapp(App):
def build(self):
layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
layout.bind(minimum_height=layout.setter('height'))
for i in range(100):
btn = Button(text='Button ' + str(i), size_hint_y=None, height=40)
layout.add_widget(btn)
root = ScrollView(
size_hint=(1, None),
size=(Window.width, Window.height)
)
root.add_widget(layout)
return root
scrollableapp().run()