Python Kivy为OneLineAvatarListItem添加Label仅最后一项生效问题
问题原因
OneLineAvatarListItem是KivyMD封装好的列表组件,内部自带用于显示文本的Label实例,1.x版本的KivyMD中该实例存储在组件的ids._lbl_primary属性中。你额外新增的自定义Label没有设置布局约束,所有新增Label都默认渲染在父组件的左上角区域,重叠后自然只有最后一个添加的Label可见。- 你给
OneLineAvatarListItem传入的text参数会自动绑定到内部自带的Label上,和你额外新增的Label无关,相当于每个列表项同时渲染了两个重叠的文本,只有最上层的最后一个自定义Label能正常显示。
解决方案
不需要额外新增Label,直接修改组件内部自带Label的属性即可实现字体自定义,修改后的完整代码如下:
from kivymd.app import MDApp from kivymd.uix.screen import Screen from kivy.uix.scrollview import ScrollView from kivymd.uix.list import MDList, OneLineAvatarListItem class DemoApp(MDApp): def build(self): screen = Screen() scroll = ScrollView() list_view = MDList() scroll.add_widget(list_view) data = ['dog', 'cat'] for i in data: items = OneLineAvatarListItem() # 直接修改内部文本Label的属性 items.ids._lbl_primary.text = i items.ids._lbl_primary.font_name = 'bebas-neue-bold' items.ids._lbl_primary.color = [.1, .1, .1, 1] list_view.add_widget(items) screen.add_widget(scroll) return screen DemoApp().run()
如果需要批量使用自定义字体的列表项,可以直接封装自定义组件,后续使用时直接传text参数即可:
from kivymd.app import MDApp from kivymd.uix.screen import Screen from kivy.uix.scrollview import ScrollView from kivymd.uix.list import MDList, OneLineAvatarListItem from kivy.lang import Builder # 注册自定义组件样式 Builder.load_string(''' <CustomOneLineAvatarListItem>: _lbl_primary: font_name: 'bebas-neue-bold' color: .1, .1, .1, 1 ''') class CustomOneLineAvatarListItem(OneLineAvatarListItem): pass class DemoApp(MDApp): def build(self): screen = Screen() scroll = ScrollView() list_view = MDList() scroll.add_widget(list_view) data = ['dog', 'cat'] for i in data: items = CustomOneLineAvatarListItem(text=i) list_view.add_widget(items) screen.add_widget(scroll) return screen DemoApp().run()
内容的提问来源于stack exchange,提问作者KryptonH
相关产品推荐
相关产品推荐

