在 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 中定义它。您只需将imageSource
和labelText
属性添加到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 中传递自定义小部件属性的主要内容,如果未能解决你的问题,请参考以下文章