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
相关产品推荐
相关产品推荐

