在 Kivy 中传递自定义小部件属性

Posted

技术标签:

【中文标题】在 Kivy 中传递自定义小部件属性【英文标题】:Pass custom widget properties in Kivy 【发布时间】:2021-11-13 11:46:23 【问题描述】:

我正在尝试构建一个自定义小部件并将其放置在 Kivy 中的 Floatlayout 中。此自定义小部件的每个实例都有一个带有图像和标签的网格布局。我希望能够在 .kv 文件中传递此自定义小部件的每个实例的图像源和标签文本。谁能帮我解决这个问题?

我在 .kv 文件中的自定义小部件如下所示:

<CustomWidget@Widget>
    updatedlabel:updatedlabel
    customimage:customimage
    background_color:(0,0,0,0)
    background_normal:''
    canvas.before:
        Color:
            rgba:(181/255,174/255,174/255,1)
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius:[28]
    GridLayout:
        canvas.before:
            Color:
                rgb: utils.get_color_from_hex("#ffffff")
            Rectangle:
                size: self.size
                pos: self.pos
        rows: 2
        cols: 1
        Image:
            id:customimage
            source: ""
        Label:
            id:updatedlabel
            text:''

对应的python代码:

class CustomWidget(Widget):
    updatedlabel = ObjectProperty(None)
    customimage = ObjectProperty(None)

    imageSource = StringProperty(None)
    labelText = StringProperty(None)

    def __init__(self, **kwargs):
        super(CustomWidget,self).__init__(**kwargs)
        self.bind(labelText=self.setter("labelText"))
        self.bind(customimage=self.setter("customimage"))
        self.updatedlabel.text=self.labelText
        self.customimage.source = self.imageSource
        self.bind(self.updatedlabel.text=self.setter("labelText"))
        self.bind(self.customimage.source = self.setter("customimage"))

以及我希望在 .kv 文件中使用我的自定义小部件的方式:

    CustomWidget:
        pos_hint:'x': 0.04, "top": 0.9
        size_hint_x: 0.16
        size_hint_y: 0.3
        labelText: "I just wrote a text"
        imageSource :"icons/picutre.PNG"

我的想法是让这个小部件的每个实例将 labelText 中的文本传递给 Label id "updatedlabel",并将 imageSource 下的图像源传递给 Image id "customimage "

感谢任何提示。

问候,

亚历克斯

【问题讨论】:

【参考方案1】:

由于您在kv 中定义了CustomWidget,因此您甚至不需要在python 中定义它。您只需将imageSourcelabelText 属性添加到kv 的定义中。以下是使用上述概念的完整示例:

from kivy.app import App
from kivy.lang import Builder

kv = '''
#:import utils kivy.utils
<CustomWidget@RelativeLayout>  # change base class to a Layout
    labelText: 'None'
    imageSource: ''
    
    updatedlabel:updatedlabel
    customimage:customimage
    
    background_color:(0,0,0,0)
    background_normal:''
    canvas.before:
        Color:
            rgba:(181/255,174/255,174/255,1)
        RoundedRectangle:
            size: self.size
            # pos: self.pos  # just use default of (0,0) because this is in a RelativeLayout
            radius:[28]
    GridLayout:
        rows: 2
        cols: 1
        Image:
            id:customimage
            source: root.imageSource
        Label:
            id:updatedlabel
            text: root.labelText
            size_hint_y: 0.25
            
FloatLayout:
    CustomWidget:
        pos_hint:'x': 0.04, "top": 0.9
        size_hint_x: 0.16
        size_hint_y: 0.3
        labelText: "I just wrote a text"
        imageSource: "icons/picutre.PNG"
'''

class TestApp(App):
    def build(self):
        return Builder.load_string(kv)

TestApp().run()

【讨论】:

是的..正是我想要的。我想我用 python 部分把事情复杂化了。感谢您的帮助

以上是关于在 Kivy 中传递自定义小部件属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在kivy中正确导入自定义小部件

使用自定义小部件 kivy

带有 kivy 语言和自定义小部件的 Kivy 滚动视图

有没有办法在 Kivy 中创建自定义属性?

单击时如何将按钮值从自定义小部件传递到 tkinter 中的主应用程序

无法将 onTap 字段传递给无状态小部件