无法在注册为工厂小部件的 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 布局中添加对象的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 语言可以访问继承的布局和小部件吗?

向 Kivy 添加小部件时如何确保功能正常

Kivy 布局高度以适应子小部件的高度

如何引用似乎超出范围的小部件 - 改编的 kivy/examples/demo/images

如果未动态添加,如何正确删除Kivy中的小部件

如何在 Kivy 中设置小部件/布局的最小允许宽度/高度?