You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy如何循环读取Python数据并在Label控件中展示日期与金额

问题原因

你当前代码仅在App类上绑定了MY_DATA列表第一条数据的date和money属性,kv文件中也只写了一组静态Label控件,自然只能展示第一条数据,无法实现全量列表循环渲染。另外注意不要让App类同时继承Screen,二者职责不同,混写会触发组件生命周期异常。

实现方案

以下提供两种可直接运行的实现,优先选择第一种适配长列表场景。

方案1:RecycleView实现(推荐,适配长列表无性能问题)

RecycleView是Kivy官方提供的列表复用组件,数据量较大时不会卡顿,支持数据自动绑定刷新。

修改后的.py文件代码

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ListProperty

MY_DATA = [
    {"date": "22/06/2022", "money": "CNY 1,000.00"},
    {"date": "23/07/2022", "money": "CNY 3,000.00"},
    {"date": "20/08/2022", "money": "CNY 5,000.00"},
]

# 定义单行数据的布局类
class DataRow(BoxLayout):
    pass

class MainApp(App):
    # 全量数据声明为列表属性,支持UI自动绑定更新
    data_list = ListProperty(MY_DATA)

    def build(self):
        return Builder.load_file("main.kv")

if __name__ == "__main__":
    MainApp().run()

修改后的main.kv文件代码

<DataRow>:
    size_hint_y: None
    height: dp(40)
    Label:
        text: root.date
        size_hint_x: None
        width: dp(150)
    Label:
        text: root.money
        size_hint_x: 1

BoxLayout:
    orientation: "vertical"
    RecycleView:
        data: [{"date": item["date"], "money": item["money"]} for item in app.data_list]
        viewclass: "DataRow"
        RecycleBoxLayout:
            default_size: None, dp(40)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: "vertical"

方案2:动态生成控件实现(适合数据量极小的简单场景)

如果列表数据不超过10条,也可以直接遍历数据动态生成对应行的控件,不需要写kv文件,逻辑更直接。

完整.py代码

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.metrics import dp

MY_DATA = [
    {"date": "22/06/2022", "money": "CNY 1,000.00"},
    {"date": "23/07/2022", "money": "CNY 3,000.00"},
    {"date": "20/08/2022", "money": "CNY 5,000.00"},
]

class MainApp(App):
    def build(self):
        root = BoxLayout(orientation="vertical")
        for item in MY_DATA:
            # 为每条数据生成一行水平容器
            row = BoxLayout(size_hint_y=None, height=dp(40))
            row.add_widget(Label(text=item["date"], size_hint_x=None, width=dp(150)))
            row.add_widget(Label(text=item["money"], size_hint_x=1))
            root.add_widget(row)
        return root

if __name__ == "__main__":
    MainApp().run()
注意事项
  • 列表类场景优先使用RecycleView,动态生成控件的方式在数据量增大后会出现明显卡顿,内存占用高。
  • 需要和UI绑定的可变数据一定要声明为Kivy对应的Property类型(比如本例的ListProperty),后续修改数据时UI会自动刷新,不需要手动操作控件。

内容的提问来源于stack exchange,提问作者Bengilla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:01:12