You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KivyMD复用Factory对象仅能删除最后一个,如何生成唯一id删除指定对象

问题根因

你当前的代码每次调用add_1方法时,都会用新创建的Factory实例覆盖self.Image_1这个实例属性,因此remove方法执行时只能拿到最后一次创建的实例,自然只能删除最后添加的对象。

解决方案

不需要额外生成唯一ID即可实现指定删除,直接把待删除的控件实例作为参数传入删除方法即可,修改逻辑如下:

  1. 修改KV代码中remove按钮的触发逻辑,将按钮的父控件(也就是你创建的Image_1实例)作为参数传给remove方法
  2. 调整Python代码中的remove方法,接收传入的控件实例并执行删除操作

修改后的完整代码

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(self.parent)  # 传入当前按钮的父控件,即Image_1实例

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):
        image_1 = Factory.Image_1()
        self.root.ids.sc_grid.add_widget(image_1)
    
    def remove(self, widget):
        if widget in self.root.ids.sc_grid.children:
            self.root.ids.sc_grid.remove_widget(widget)
        
MyApp().run()

补充:唯一ID的实现方式

如果业务场景确实需要给每个对象加唯一标识,可以自行维护:

  • 用Python内置的uuid模块生成唯一ID,给每个创建的Factory实例新增自定义属性存储:image_1.uid = uuid.uuid4().hex
  • 也可以维护一个全局计数器,每创建一个实例计数器加1,将数值作为ID绑定到实例上

内容的提问来源于stack exchange,提问作者Ctrl7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:06:05