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

Python Kivy中如何为每个OneLineAvatarListItem单独添加自定义Label

问题原因

直接将Label添加到OneLineAvatarListItem时未指定位置规则,所有Label默认堆叠在窗口左下角,前序Label会被最后添加的Label覆盖,因此视觉上仅最后一个列表项显示标签。完全可以仅通过Python代码实现需求,推荐两种实现方案:

方案1:使用列表项预留右侧组件插槽(推荐)

KivyMD的列表项自带_right_widget属性,专门用于放置右侧附加组件,会自动适配位置无需手动调整,修改后代码如下:

from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivymd.uix.list import MDList, OneLineAvatarListItem

class MyApp(MDApp):
    def build(self):
        Window.clearcolor = (100, 100, 100, 1)
        window = BoxLayout()
        screen = Screen()
        scroll = ScrollView()
        list_view = MDList()
        scroll.add_widget(list_view)
        
        for i in range(10):
            items = OneLineAvatarListItem(text=str(i))
            label = Label(text='www', color=[.1, .1, .1, 1])
            # 直接赋值给预留右侧组件属性即可自动适配位置
            items._right_widget = label
            list_view.add_widget(items)
            
        screen.add_widget(scroll)
        window.add_widget(screen)
        return window

MyApp().run()

方案2:手动绑定位置规则

如果需要把标签放在列表项的其他自定义位置,可以绑定Label的位置属性随列表项动态变化,只需要修改循环部分代码即可:

for i in range(10):
    items = OneLineAvatarListItem(text=str(i))
    label = Label(text='www', color=[.1, .1, .1, 1], size_hint=(None, None), size=(40, 20))
    items.add_widget(label)
    # 绑定标签位置随列表项位置更新,括号内坐标可自定义调整位置
    def update_pos(instance, value):
        instance.pos = (items.x + 20, items.y + 10)
    label.bind(pos=update_pos)
    list_view.add_widget(items)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:04