KivyMD复用Factory对象仅能删除最后一个,如何生成唯一id删除指定对象
问题根因
你当前的代码每次调用add_1方法时,都会用新创建的Factory实例覆盖self.Image_1这个实例属性,因此remove方法执行时只能拿到最后一次创建的实例,自然只能删除最后添加的对象。
解决方案
不需要额外生成唯一ID即可实现指定删除,直接把待删除的控件实例作为参数传入删除方法即可,修改逻辑如下:
- 修改KV代码中remove按钮的触发逻辑,将按钮的父控件(也就是你创建的Image_1实例)作为参数传给remove方法
- 调整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
相关产品推荐
相关产品推荐

