Kivy 中实现固定高度可滚动的五列图片卡片网格视图

大婷小哥_7311

大婷小哥_7311

2026-09-19

508人浏览

原创

Kivy 中实现固定高度可滚动的五列图片卡片网格视图

本文介绍如何在 kivy 中构建一个高度占窗口 75%、支持垂直滚动的 5 列动态图片卡片网格,每张卡片包含标题按钮和等比缩放的图片,并确保布局自适应且无拉伸失真。

本文介绍如何在 kivy 中构建一个高度占窗口 75%、支持垂直滚动的 5 列动态图片卡片网格,每张卡片包含标题按钮和等比缩放的图片,并确保布局自适应且无拉伸失真。

在 Kivy 中实现「固定可视区域 + 可滚动内容」的网格布局,关键在于正确组合 ScrollViewGridLayout 的尺寸约束逻辑。原代码中 ScrollView 虽启用了滚动,但未限制其自身高度,导致整个网格被强制压缩进窗口;同时 GridLayout 缺少 size_hint_y: Noneheight: self.minimum_height,使其无法随子项增长,从而剥夺了 ScrollView 的滚动依据。

以下是推荐的结构化实现方案(基于 KV 语言 + Python 逻辑分离):

核心要点解析:

  • ScrollView.size_hint_y: 0.75:明确限定滚动区域高度为窗口高度的 75%,剩余空间可留给其他 UI 元素(如标题栏、搜索框等)。
  • GridLayout.size_hint: (1, None) + height: self.minimum_height:告知网格不继承父容器高度,而是根据子项总高自动扩展——这是启用滚动的必要前提。
  • 每个 CardBoxLayout)必须设置 size_hint_y: None 和固定 height(如 150),否则 minimum_height 无法准确计算;其中 ButtonImage 通过 size_hint_y 按比例分配高度(如 0.250.75),保证图文比例稳定。
  • 图片使用 texture 属性而非 source,便于复用缓存纹理(如你的 image_cache.get_image(uuid)),避免重复加载。

? 完整可运行示例:

# kv 字符串定义(或保存为 .kv 文件)
ScrollView:
    size_hint_y: 0.75
    do_scroll_x: False
    do_scroll_y: True
    smooth_scroll_end: 15
    scroll_wheel_distance: 20

    GridLayout:
        id: grid
        cols: 5
        spacing: [8, 12]  # 列间距、行间距
        padding: 10
        size_hint: 1, None
        height: self.minimum_height

<card>:
    orientation: 'vertical'
    size_hint: 1, None
    height: 160  # 总高度 = 标题区 + 图片区(建议 ≥140,留出内边距)
    Button:
        text: root.text
        font_size: '14sp'
        size_hint_y: 0.25
        background_normal: ''
        background_color: 0.95, 0.95, 0.95, 1
        color: 0, 0, 0, 1
    Image:
        texture: root.texture
        size_hint_y: 0.75
        allow_stretch: False  # 严格保持原始宽高比
        keep_ratio: True</card>
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty, ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image

# 示例:模拟从缓存加载纹理(替换为你的真实 image_cache)
def mock_image_cache(uuid):
    # 实际中应返回 Texture 对象,此处用占位图示意
    return CoreImage('icon.png', keep_data=True).texture

class Card(BoxLayout):
    text = StringProperty('')
    texture = ObjectProperty(None)

class MyApp(App):
    def build(self):
        # 延迟填充数据,确保 KV 已加载、root 已构建
        Clock.schedule_once(self.fill_grid)
        return Builder.load_string(kv)

    def fill_grid(self, _dt):
        grid = self.root.ids.grid
        # 替换为你真实的 records.items() 循环
        for idx in range(30):  # 模拟 30 张卡片
            uuid = f"item_{idx}"
            record_name = f"Item {idx}"
            # 真实项目中:texture = image_cache.get_image(uuid)
            texture = mock_image_cache(uuid)
            grid.add_widget(Card(text=record_name, texture=texture))

if __name__ == '__main__':
    MyApp().run()

⚠️ 注意事项:

  • 若图片源为网络或大文件,请务必在后台线程加载并绑定到主线程更新,避免阻塞 UI;可结合 kivy.clock.CyClockBase.create_triggerasyncio 实现异步纹理加载。
  • allow_stretch: Falsekeep_ratio: True 是保持图像不失真的黄金组合,切勿省略。
  • GridLayout.spacingCard.padding 可提升视觉呼吸感,避免卡片紧贴边缘。
  • 如需响应式列数(如横屏自动变为 6 列),可通过 Window.bind(size=self.on_window_resize) 动态重设 grid.cols 并触发 grid.fbind('minimum_height', ...) 重排。

该方案兼顾性能、可维护性与视觉一致性,是 Kivy 中构建媒体画廊、商品列表等场景的推荐实践。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3624

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1549

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20677

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2567

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2627

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2023

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习