如何更改 kivymd 中其他 kv 字符串的属性?

Posted

技术标签:

【中文标题】如何更改 kivymd 中其他 kv 字符串的属性?【英文标题】:How to change other kv string's property in kivymd? 【发布时间】:2021-04-14 19:09:58 【问题描述】:

我使用的是 kivymd MDList,但我遇到了问题。

我的代码:

from kivymd.app import MDApp
from kivy.lang.builder import Builder

example_list = ['a', 'b', 'c']

KV = """
ScrollView:
    MDList:
        id: List
"""

ListItem = """
OneLineAvatarListItem:
    id: item
    text: ""
    ImageLeftWidget:
        source: "icon.png"
"""

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

    def on_start(self):
        for letter in example_list:
            self.root.ids.item.text = letter
            self.root.ids.List.add_widget(Builder.load_string(ListItem))

MainApp().run()

我想显示像this这样的列表,但是我的代码出现了这个错误:

 Traceback (most recent call last):
   File "kivy\properties.pyx", line 861, in kivy.properties.ObservableDict.__getattr__
 KeyError: 'item'

我认为ListItem 不是root,但我不知道如何解决。

如何更改 ListItem 的文本属性?

【问题讨论】:

好像没有,我用的KivyMD不是很多,但是看到小部件,那边没有text属性 好的。我的错。 ListItem 中有文本属性。我会编辑。 我认为你需要创建一个普通的BoxLayout并为每个字母添加一个ListItem 哦。我绝对不想那样做……有没有办法用循环来做到这一点? 哦,诺诺,你会用循环,给我一些时间,我会尽力回答 【参考方案1】:

在这种情况下,与其从 kv 字符串加载小部件,在 python 中制作它会更容易,只需正常创建 MDList 并在循环的每次迭代中,创建一个新的 OneLineAvatarListItem 小部件,设置其属性,添加图像,然后将整个小部件添加到 MDList。

代码

from kivymd.app import MDApp
from kivymd.uix.list import OneLineAvatarListItem, ImageLeftWidget
from kivy.lang.builder import Builder

example_list = ['a', 'b', 'c']

KV = """
ScrollView:
    MDList:
        id: List
"""

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

    def on_start(self):
        global example_list
        for letter in example_list:
            one_line = OneLineAvatarListItem(text = letter)
            image = ImageLeftWidget(source = "icon.png")
            one_line.add_widget(image)
            self.root.ids.List.add_widget(one_line)

MainApp().run()

【讨论】:

谢谢!但我的最后一个问题:在 PyCharm 中,它运行良好,但在 source = "icon.png" 上显示警告 Unexpected argument。你知道为什么吗?谢谢! @JayLee 可能是因为 init 没有源参数,尝试这样做image = ImageLeftWidget() 然后在下一行image.source = "icon.png" @JayLee 乐于助人:)

以上是关于如何更改 kivymd 中其他 kv 字符串的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何动态更改 MDDialog KivyMD 中的文本字段?

使用按钮更改 kivy 或 kivymd 中的屏幕

如何在 KivyMD 的 .kv 文件中使用 kivy 中的数据表?

我如何在 KivyMD 中制作多行标签?

如何使用 Python 代码从 kv 文件中的 TextField 获取数据?

在 KivyMD Python 中更改开始屏幕时,如何在启动时显示或关闭消息?