为每个 OneLineAvatarListItem 添加标签 Python Kivy

Adding labels for each OneLineAvatarListItem Python Kivy

我正在尝试为 OneLineAvatarListItem 中的每个项目添加标签,但只为最后一个 OneLineListItem 添加项目,我可以仅使用 python 来完成吗? 我的代码:

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
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.add_widget(label)
            list_view.add_widget(items)
            
            
        screen.add_widget(scroll)
       
        window.add_widget(screen)
        
        
        return window



MyApp().run()

Im getting that

使用文档中的示例 - CustomItem - 我创建了带有标签的自定义 ListItem,该标签使用 ILeftBody 显示在标准文本的左侧。

from kivymd.app import MDApp
from kivymd.uix.list import OneLineAvatarListItem, ILeftBody
from kivymd.uix.label import MDLabel

from kivy.lang import Builder


KV = '''
<MyItemList>:

    LeftLabel:
        id: left_label

BoxLayout:

    ScrollView:

        MDList:
            id: scroll
'''


class MyItemList(OneLineAvatarListItem):
    '''Custom list item.'''

class LeftLabel(ILeftBody, MDLabel):
    '''Custom left container.'''

class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for i in range(30):
            item = MyItemList(text=f"Item {i}", on_release=self.on_click_item)
            #print(item.ids)
            item.ids.left_label.text = str(i)
            
            self.root.ids.scroll.add_widget(item)

    def on_click_item(self, widget):
        print('text:', widget.text, 'left_label.text:',  widget.ids.left_label.text)

MainApp().run()

结果:

我尝试使用 IRightBody 添加其他标签,但它对 OneLineAvatarListItem 不起作用,但可以使用 OneLineAvatarIconListItem(名称中带有 Icon)。

from kivymd.app import MDApp
from kivymd.uix.list import OneLineAvatarIconListItem, ILeftBody, IRightBody
from kivymd.uix.label import MDLabel
from kivy.lang import Builder


KV = '''
<MyItemList>:

    LeftLabel:
        id: left_label

    RightLabel:
        id: right_label
    
BoxLayout:

    ScrollView:

        MDList:
            id: scroll
'''


class MyItemList(OneLineAvatarIconListItem):
    '''Custom list item.'''

class LeftLabel(ILeftBody, MDLabel):
    '''Custom left container.'''

class RightLabel(IRightBody, MDLabel):
    '''Custom right container.'''
        
class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for i in range(30):
            item = MyItemList(text=f"Item {i}", on_release=self.on_click_item)
            #print(item.ids)
            item.ids.left_label.text = str(i)
            item.ids.right_label.text = str(100+i)
            
            self.root.ids.scroll.add_widget(item)

    def on_click_item(self, widget):
        print('text:', widget.text, 'left_label.text:',  widget.ids.left_label.text, 'right_label.text:',  widget.ids.right_label.text)

MainApp().run()

结果:


对于Label,您可以使用ILeftBody/IRightBody而不使用Touch,它会将运行功能分配给ListItem。但是如果你想添加 ButtonCheckButton 并为这个小部件分配功能,那么它可能需要 ILeftBodyTouch/IRightBodyTouch 而没有 Touch

from kivymd.app import MDApp
from kivymd.uix.list import OneLineAvatarIconListItem, ILeftBody, IRightBodyTouch
from kivymd.uix.label import MDLabel
from kivymd.uix.button import MDTextButton
from kivy.lang import Builder

KV = '''
<MyItemList>:

    LeftLabel:
        id: left_label

    RightButton:
        id: right_button
#        on_release: app.on_click_right_button(self)
        
BoxLayout:

    ScrollView:

        MDList:
            id: scroll
'''


class MyItemList(OneLineAvatarIconListItem):
    '''Custom list item.'''

class LeftLabel(ILeftBody, MDLabel):
    '''Custom left container.'''

class RightButton(IRightBodyTouch, MDTextButton):
    '''Custom right container.'''
        
class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for i in range(30):
            item = MyItemList(text=f'Item {i}', on_release=self.on_click_item)
                        
            #print(item.ids)
            item.ids.left_label.text = str(i)
            item.ids.right_button.text = f'More {i}'
            item.ids.right_button.on_release = lambda widget=item.ids.right_button:self.on_click_right_button(widget)  # it needs `widget=...` because created in `for`-loop
            
            self.root.ids.scroll.add_widget(item)

    def on_click_item(self, widget):
        print('--- on_click_item ---')
        print('wdiget.text:', widget.text, 'left_label.text:',  widget.ids.left_label.text, 'right_button.text:',  widget.ids.right_button.text)

    def on_click_right_button(self, widget):
        print('--- on_click_right_button ---')
        print('wdiget.text:',  widget.text)
        print('widget.parent.parent:', widget.parent.parent)
        print('widget.parent.parent.text:', widget.parent.parent.text)

MainApp().run()