TLDR: 是否有一个好的方法在Kivy中为按钮(或任何小组件)添加自定义元数据?
在Kivy中,我设置了一些东西,我的应用程序将动态生成一组按钮,基于选择的特定 "标签"(在这个例子中,我传递 "水果 "标签)。
然后生成两个列表。第一个列表是元素的名称(例如水果的名称)。第二个列表是该元素的唯一标识符(数据是从某个主数据库中提取的,该数据库将所有这些信息链接在一起)。
然后,我有一个类方法,根据生成的项目列表,在GridLayout中生成按钮。
#This section is in the .py file
itemNameList = ["Apple", "Banana", "Cherry"]
itemUniqueIDList = ["Unique1", "Unique2", "Unique3"]
for ProductName,ProductUniqueID in zip(itemNameList,itemUniqueIDList):
#For each element in the list of products
#add a button widget to the WidgetID instance
WidgetID.add_widget(
Button(
id=ProductUniqueID,#THIS IS THE POTENTIAL ISSUE
text=ProductName,
on_press=self.on_press_Product_Select_Button
)
)
现在,我试图设置我的代码,使我总是尝试使用唯一的标识符来提取任何其他所需的信息(例如,如果我想要 "Cherry "的价格,我想引用唯一的ID,并使用它来提取价格信息)。因此,当我按下'Cherry'这样的按钮时,我也想获得'Cherry'的唯一ID。我目前的变通方法是将Button的ID设置为该按钮所对应的商品的唯一ID。
因此,当这些动态生成的按钮中的一个被按下时,我将提取文本(例如'Cherry')和相关的唯一ID(例如'Unique3'),如下所示。
#This section is in the .py file
def on_press_item(self, instance):
#Method that will be called when a button of an item (e.g. the 'Cherry' button' is pressed
ProductName = instance.text #Returns 'Cherry'
ProductUniqueID = instance.id #"Returns 'Unique3'
然而,我注意到我得到了以下警告,我怀疑这是因为我在生成按钮时设置了按钮的id(因为当我注释掉这一行时,警告不再出现)。
[WARNING] Deprecated property "<StringProperty name=id>" of object "<kivy.uix.button.Button object at 0x000001EB791BC388>" has been set, it will be removed in a future version
作为参考,这里是.kv文件中与这部分代码交互的部分。
#This section is in the .kv file
GridLayout:
id:menu_item_button_layout
cols: 4
on_parent:
root.GenerateProductButtons(WidgetID=menu_item_button_layout)
编辑:有一些错误的文字需要删除
你可以只设置一个普通属性。
button = Button(...)
button.my_custom_attr = 'value'