访问具有相同 id 的对象

Accessing objects with same id

为了重现性,我多次重复使用一个对象而不是创建一个新对象,

我将 Factory 对象添加到主布局中并使用删除按钮我可以删除添加的对象,

但是如果我将 2 个或更多对象添加到布局中,删除功能仅适用于最后添加的对象

那么有没有什么机制可以为一个对象生成一个唯一的 id,然后可以用来删除它

代码

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.factory import Factory 

kv='''

<Image_1@BoxLayout>:

    orientation:'vertical'
    id:img_1   
    Image:
        source:"/storage/emulated/0/Download/download (37).jpeg"
    Button:
        text:"remove"
        on_press:app.remove()
    
 

BoxLayout:
    orientation:'vertical'
    
                        
    GridLayout:
        cols:1
        id:sc_grid
        
        Button:
            size_hint:None,None 
            text:"add"
            on_press:
                app.add_1()      
                              

'''

class MyApp(MDApp):
    
    def build(self):
        return Builder.load_string(kv)
    
    def add_1(self):
        self.Image_1=Factory.Image_1()
        self.root.ids.sc_grid.add_widget(self.Image_1)
    def remove(self):
        self.root.ids.sc_grid.remove_widget(self.Image_1)
        
MyApp().run()

不确定您的应用最终会做什么,但您可以在没有 ID 的情况下完成。

通过将删除处理程序添加到 Image 对象并使用 self.parent.remove 访问它。或者,您可以将列表中的对象跟踪到 add/remove 个项目。

要创建 UUID,您可以使用 Pythons uuid.uuid4() 方法,但我认为这是可选的。

请查看下面允许添加和删除项目的代码。

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.factory import Factory 
import uuid

kv='''

<Image_1@BoxLayout>:

    orientation:'vertical'
    #id:img_1   
    Image:
        source:"/storage/emulated/0/Download/download (37).jpeg"
    Button:
        text:"remove"
        on_press: self.parent.remove()
    
 

BoxLayout:
    orientation:'vertical'
    
                        
    GridLayout:
        cols:1
        id:sc_grid
        
        Button:
            size_hint:None,None 
            text:"add"
            on_press:
                app.add()      
                              

'''

class MyApp(MDApp):
    
    def build(self):
        return Builder.load_string(kv)
    
    def add(self):
        Image=Factory.Image_1()
        # Image.id = uuid.uuid4()
        Image.remove = lambda: self.root.ids.sc_grid.remove_widget(Image)
        self.root.ids.sc_grid.add_widget(Image)
        
MyApp().run()