【问题标题】:Adding labels for each OneLineAvatarListItem Python Kivy为每个 OneLineAvatarListItem Python Kivy 添加标签
【发布时间】:2021-10-18 18:13:42
【问题描述】:

我正在尝试为 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

【问题讨论】:

  • 你到底想在哪里添加Label,使用TwoLineListItem不是更方便吗?
  • 我想为每个列表元素添加标签到右边,我可以使用 TwoLineListItem 但我不知道如何将secondary_text 移动到右边
  • 也许这个小部件不是为了添加其他小部件而创建的 - 这会产生问题。您可能需要从头开始构建自己的小部件。
  • 我不能再问一个问题了,这是题外话,但我怎样才能使 OneLineAvatarListItem 可点击?有可能吗?
  • OneLineAvatarListItem 已经可以点击了——它是用ButtonBehavior 构建的,所以当你悬停或点击它时它会改变颜色。也许您的问题是如何为项目分配功能?

标签: python kivy


【解决方案1】:

使用文档中的示例 - 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,您可以在不使用Touch 的情况下使用ILeftBody/IRightBody,它将运行分配给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()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多