无法在注册为工厂小部件的 kivy 布局中添加对象
Posted
技术标签:
【中文标题】无法在注册为工厂小部件的 kivy 布局中添加对象【英文标题】:Unable to add objects inside kivy layout regisered as a factory widget 【发布时间】:2021-10-04 07:07:25 【问题描述】:我一直在尝试在注册为工厂对象的 BoxLayout 中添加几个小部件,
这就是我的代码的样子
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.factory import Factory
kv='''
# THIS is object 1 which will be added to main grid
<object_1@BoxLayout>:
orientation:'vertical'
size_hint_y:None
adaptive_height: True
height:self.minimum_height
id:obj_1
Button:
size_hint:None,None
on_press:app.add2()
# this is object_2 which i want to be added into
object_1
<object_2@BoxLayout>:
orientation:'vertical'
size_hint_y:None
adaptive_height: True
height:self.minimum_height
id:obj_2
#main grid
BoxLayout:
orientation:'vertical'
size_hint_y:None
adaptive_height: True
height:self.minimum_height
GridLayout:
cols:1
size_hint_y:None
adaptive_height:True
height:self.minimum_height
id:sc_grid
Button:
size_hint:None,None
on_press:
app.add_1()
'''
class MyApp(MDApp):
def build(self):
return Builder.load_string(kv)
def add_1(self):
self.root.ids.sc_grid.add_widget(Factory.object_1())
MyApp().run()
在上面的代码中,当按钮被按下时,object_1被添加到主网格中,
我需要在 object_1 中添加 object_2 我该怎么做?
【问题讨论】:
请发布minimal reproducible example 以及错误堆栈跟踪。 @john Anderson 我已经用更多代码更新了它,你现在可以查看它 【参考方案1】:您可以在kv
中调用add_widget()
,而不是尝试调用App
中的方法。您必须包括:
#:import Factory kivy.factory.Factory
在您的kv
中,以便在您的kv
中使用Factory
。然后你可以替换:
on_press:app.add2()
与:
on_press: root.add_widget(Factory.object_2())
这是使用上述方法的 kv
的修改版本:
#:import Factory kivy.factory.Factory
# THIS is object 1 which will be added to main grid
<object_1@BoxLayout>:
orientation:'vertical'
size_hint_y:None
adaptive_height: True
height:self.minimum_height
id:obj_1
Button:
text: 'Add 2'
size_hint:None,None
on_press: root.add_widget(Factory.object_2())
# this is object_2 which i want to be added into object_1
<object_2@BoxLayout>:
orientation:'vertical'
size_hint_y:None
adaptive_height: True
height:self.minimum_height
id:obj_2
Label:
text: 'Object 2'
color: 0,0,0,1
size_hint: None, None
size: self.texture_size
#main grid
BoxLayout:
orientation:'vertical'
size_hint_y:None
adaptive_height: True
height:self.minimum_height
GridLayout:
cols:1
size_hint_y:None
adaptive_height:True
height:self.minimum_height
id:sc_grid
Button:
size_hint:None,None
text: 'Add 1'
on_press:
app.add_1()
我添加了一些小的更改(例如 object_2
中的 Label
),以便更轻松地查看结果。
此外,尽管此代码有效,但您的类名应以大写字母开头。不遵循该建议实际上会导致您的 kv
出现错误。
【讨论】:
非常感谢您的帮助..!! 实际上我尝试从应用程序调用它,因为我有后端算法,也应该在按下时执行,无论如何我会尝试通过子小部件(object_2)执行该部分 您可以通过App
中的方法来实现,但您需要将object_1
对象传递给该方法。否则,无法知道添加了哪个object_1
。类似:on_press:app.add2(root)
,那么App
中的方法将被定义为:def add2(self, object_1_instance):
我去看看以上是关于无法在注册为工厂小部件的 kivy 布局中添加对象的主要内容,如果未能解决你的问题,请参考以下文章