Skip to content

Scrollbar

配置可滚动控件为其内容渲染的滚动条。

示例 ​

python
from typing import Optional

import flet as ft


def main(page: ft.Page):
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
    page.appbar = ft.AppBar(title="Scrollbar Dataclass Showcase")

    def get_scrollbar() -> ft.Scrollbar:
        def str_as_bool(value: Optional[str]) -> Optional[bool]:
            return True if value == "true" else False if value == "false" else None

        return ft.Scrollbar(
            thumb_visibility=str_as_bool(thumb_visibility.value),
            track_visibility=str_as_bool(track_visibility.value),
            interactive=str_as_bool(interactive.value),
            thickness=thickness_value.value if use_thickness.value else None,
            radius=radius_value.value if use_radius.value else None,
            orientation=None
            if orientation.value == "none"
            else ft.ScrollbarOrientation(orientation.value),
        )

    def get_preview_content(scrollbar: ft.Scrollbar) -> tuple[str, ft.Control]:
        selected_orientation = scrollbar.orientation
        is_horizontal = selected_orientation in (
            ft.ScrollbarOrientation.TOP,
            ft.ScrollbarOrientation.BOTTOM,
        )
        if is_horizontal:
            return (
                "Horizontal preview (TOP/BOTTOM orientation)",
                ft.Row(
                    spacing=8,
                    scroll=scrollbar,
                    controls=[
                        ft.Container(
                            width=110,
                            height=80,
                            border=ft.Border.all(1, ft.Colors.OUTLINE_VARIANT),
                            border_radius=8,
                            bgcolor=ft.Colors.SURFACE_CONTAINER_HIGHEST,
                            alignment=ft.Alignment.CENTER,
                            content=ft.Text(f"Tile {i + 1}"),
                        )
                        for i in range(18)
                    ],
                ),
            )

        return (
            "Vertical preview (None/LEFT/RIGHT orientation)",
            ft.Column(
                spacing=4,
                scroll=scrollbar,
                controls=[ft.Text(f"Item {i + 1}") for i in range(40)],
            ),
        )

    def update_preview():
        thickness_value.disabled = not use_thickness.value
        radius_value.disabled = not use_radius.value

        scrollbar = get_scrollbar()
        title, content = get_preview_content(scrollbar)
        preview_title.value = title
        preview_viewport.content = content
        page.update()

    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    ft.Text(
                        "Interactive playground for the Scrollbar dataclass. "
                        "Change each property and inspect the live result."
                    ),
                    ft.Row(
                        wrap=True,
                        spacing=12,
                        run_spacing=12,
                        alignment=ft.MainAxisAlignment.CENTER,
                        controls=[
                            ft.Container(
                                width=360,
                                padding=12,
                                border=ft.Border.all(1, ft.Colors.OUTLINE_VARIANT),
                                border_radius=10,
                                bgcolor=ft.Colors.SURFACE_CONTAINER_LOW,
                                content=ft.Column(
                                    spacing=10,
                                    controls=[
                                        ft.Text(
                                            "Configuration", weight=ft.FontWeight.BOLD
                                        ),
                                        thumb_visibility := ft.Dropdown(
                                            label="thumb_visibility",
                                            value="none",
                                            on_select=update_preview,
                                            options=[
                                                ft.DropdownOption(
                                                    "none", "None (theme default)"
                                                ),
                                                ft.DropdownOption("true", "True"),
                                                ft.DropdownOption("false", "False"),
                                            ],
                                        ),
                                        track_visibility := ft.Dropdown(
                                            label="track_visibility",
                                            value="none",
                                            on_select=update_preview,
                                            options=[
                                                ft.DropdownOption(
                                                    "none", "None (theme default)"
                                                ),
                                                ft.DropdownOption("true", "True"),
                                                ft.DropdownOption("false", "False"),
                                            ],
                                        ),
                                        interactive := ft.Dropdown(
                                            label="interactive",
                                            value="none",
                                            on_select=update_preview,
                                            options=[
                                                ft.DropdownOption(
                                                    "none", "None (platform default)"
                                                ),
                                                ft.DropdownOption("true", "True"),
                                                ft.DropdownOption("false", "False"),
                                            ],
                                        ),
                                        orientation := ft.Dropdown(
                                            label="orientation",
                                            value="none",
                                            on_select=update_preview,
                                            options=[
                                                ft.DropdownOption(
                                                    "none", "None (auto side)"
                                                )
                                            ]
                                            + [
                                                ft.DropdownOption(o.value, o.name)
                                                for o in ft.ScrollbarOrientation
                                            ],
                                        ),
                                        use_thickness := ft.Checkbox(
                                            label="Set thickness",
                                            value=False,
                                            on_change=update_preview,
                                        ),
                                        thickness_value := ft.Slider(
                                            min=0,
                                            max=20,
                                            divisions=20,
                                            value=8,
                                            label="{value}",
                                            on_change=update_preview,
                                        ),
                                        use_radius := ft.Checkbox(
                                            label="Set radius",
                                            value=False,
                                            on_change=update_preview,
                                        ),
                                        radius_value := ft.Slider(
                                            min=0,
                                            max=20,
                                            divisions=20,
                                            value=8,
                                            label="{value}",
                                            on_change=update_preview,
                                        ),
                                    ],
                                ),
                            ),
                            ft.Container(
                                width=420,
                                padding=12,
                                border=ft.Border.all(1, ft.Colors.OUTLINE_VARIANT),
                                border_radius=10,
                                bgcolor=ft.Colors.SURFACE_CONTAINER_LOW,
                                content=ft.Column(
                                    spacing=10,
                                    controls=[
                                        ft.Text(
                                            "Live preview", weight=ft.FontWeight.BOLD
                                        ),
                                        preview_title := ft.Text(
                                            weight=ft.FontWeight.BOLD
                                        ),
                                        preview_viewport := ft.Container(
                                            height=260,
                                            border=ft.Border.all(1, ft.Colors.OUTLINE),
                                            border_radius=8,
                                            padding=8,
                                        ),
                                    ],
                                ),
                            ),
                        ],
                    ),
                ],
            ),
        )
    )

    update_preview()


if __name__ == "__main__":
    ft.run(main)

属性 ​

名称类型默认值说明
thumb_visibilityOptional[bool]None此滚动条的滑块是否应始终可见,即使未被滚动时也是如此。当为 False 时,滚动条会在滚动期间显示,其余时间淡出。如果为 None,则使用 thumb_visibility。如果它也是 None,则默认为 False。
track_visibilityOptional[bool]None指示只要 thumb_visibility 可见,滚动条轨道是否应可见。如果为 None,则使用 track_visibility。如果它也是 None,则默认为 False。
thicknessOptional[Number]None以逻辑像素为单位控制滚动条的交叉轴尺寸。滚动条在可滚动组件交叉轴上的厚度。如果为 None,默认值取决于平台:在 Android(platform == ANDROID)和 iOS(platform == IOS)上为 4.0 像素;其余平台使用 thickness。
radiusOptional[Number]None滚动条滑块圆角矩形角的圆角半径,以逻辑像素为单位。如果为 None,则使用平台默认值。滚动条滑块圆角矩形角的半径。如果为 None,默认值取决于平台:在 Android(platform == ANDROID)上不应用圆角;在 iOS(platform == IOS)上为 1.5 像素;其余平台为 8.0 像素。
interactiveOptional[bool]None此滚动条是否应可交互,并响应拖动滑块或在轨道区域点击的操作。当为 False 时,滚动条不会响应手势或悬停事件,并允许点击穿透。如果为 None,默认为 True,但在 Android 上默认为 False。
orientationOptional[ScrollbarOrientation]None指定滚动条相对于可滚动组件应出现的位置。如果为 None,对于垂直滚动,在从左到右的文本方向下默认为 RIGHT,在从右到左的文本方向下默认为 LEFT;而对于水平滚动,默认为 BOTTOM。注意:TOP 和 BOTTOM 只能用于水平滚动;LEFT 和 RIGHT 只能用于垂直滚动。

关注我,学习大模型、大数据、Python等热门技术。