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 类的其他属性如下所示 −

  1. do_scroll − 允许在 X 或 Y 轴上滚动。

  2. do_scroll_x − 允许在 X 轴上滚动。这是一个 BooleanProperty,默认为 True。

  3. do_scroll_y − 允许在 Y 轴上滚动。这是一个 BooleanProperty,默认为 True。

  4. scroll_distance − 开始滚动 ScrollView 之前滚动的距离(以像素为单位)。这是一个数字属性,且默认值为 20 像素。

  5. scroll_timeout − 允许触发 scroll_distance 的超时(以毫秒为单位),默认值为 55 毫秒。

  6. scroll_to() − 滚动视区以确保给定小组件可见,可以选择使用填充和动画。

  7. scroll_type − 设置用于 scrollview 中内容滚动的类型。可选的选项有:['content'], ['bars'], ['bars', 'content']。

  8. 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()

Output

运行上述代码。要超出视图中可见的按钮,请使用鼠标垂直滚动或在触摸屏设备上使用手指滚动。

kivy scrollview