访问具有相同 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()
为了重现性,我多次重复使用一个对象而不是创建一个新对象,
我将 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()