在python中动态添加.kv childwidget

在python中动态添加.kv childwidget,python,kivy,Python,Kivy,我试图在python中的另一个(网格)布局小部件中动态添加标签(在本例中为LightL和DarkL) 我尝试使用IDs,但我不确定如何使用add_小部件实现它。 childlabels有一个背景色(矩形),我希望所有新创建的都是相同的格式 from kivy.lang import Builder from kivy.properties import NumericProperty from kivy.uix.screenmanager import Screen from kivy.app

我试图在python中的另一个(网格)布局小部件中动态添加标签(在本例中为LightL和DarkL)

我尝试使用IDs,但我不确定如何使用add_小部件实现它。 childlabels有一个背景色(矩形),我希望所有新创建的都是相同的格式

from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.screenmanager import Screen
from kivy.app import App
import kivy

kv = Builder.load_string("""
<BackgroundColor@Widget>
    background_color: 1, 1, 1, 1
    canvas.before:
        Color:
            rgba: root.background_color
        Rectangle:
            size: self.size
            pos: self.pos

<LightL@Label+BackgroundColor>
    background_color: 0.15, 0.15, 0.15, 1
    size_hint_x: 0.0725
<DarkL@Label+BackgroundColor>
    background_color: 0.1, 0.1, 0.1, 1

<IndexScreen>:
    BoxLayout:
       id: DynBox

       GridLayout:
           cols: 4
           LightL:
               id: LightLid
               text: ""
           DarkL:
               id: DarkLid
               text: ""
       BoxLayout:
           orientation: 'vertical'
           Label:
               text:'topright'
           Label:
               text:'bottomright'
""")

class IndexScreen(Screen):
    pass

class MainApp(App):
    xn = NumericProperty()

    def build(self):
        self.root = kv
        self.AddLabel()
        return self.root

    def AddLabel(self, *arg):
        for xn in range(0, 8):
            App.DarkLid.add_widget(Builder.load_string('''
Label:
    text:
        '#D: {}'.format(self.xn)
'''))
            App.LightLid.add_widget(Builder.load_string('''
Label:
    text:
        '#L: {}'.format(self.xn)
'''))
        return

if __name__ == "__main__":
    MainApp().run
来自kivy.lang导入生成器
从kivy.properties导入NumericProperty
从kivy.uix.screenmanager导入屏幕
从kivy.app导入应用程序
进口克维
kv=生成器。加载字符串(“”)
背景颜色:1,1,1,1
在以下情况之前:
颜色:
rgba:root.background\u颜色
矩形:
大小:self.size
pos:self.pos
背景颜色:0.15,0.15,0.15,1
尺寸:0.0725
背景颜色:0.1,0.1,0.1,1
:
盒子布局:
id:DynBox
网格布局:
科尔斯:4
LightL:
id:LightLid
案文:“”
黑色:
id:DarkLid
案文:“”
盒子布局:
方向:“垂直”
标签:
文本:'topright'
标签:
文本:'bottomright'
""")
类别索引屏幕(屏幕):
通过
类主应用程序(应用程序):
xn=NumericProperty()
def生成(自):
自根=千伏
self.AddLabel()
返回自根
def添加标签(自身,*arg):
对于范围(0,8)内的xn:
App.DarkLid.add_小部件(Builder.load_字符串(“”)
标签:
正文:
#D:{}格式(self.xn)
'''))
App.LightLid.add_小部件(Builder.load_字符串(“”)
标签:
正文:
'#L:{}'。格式(self.xn)
'''))
返回
如果名称=“\uuuuu main\uuuuuuuu”:
MainApp()。运行

我认为问题在于你对
kv
的定义
LightL
DarkL
。如果您将这些定义简化为:

<LightL@Label>:
    background_color:  0.15, 0.15, 0.15, 1
    canvas.before:
        Color:
            rgba: root.background_color
        Rectangle:
            size: self.size
            pos: self.pos
<DarkL@Label>:
    background_color:  0.1, 0.1, 0.1, 1
    canvas.before:
        Color:
            rgba: root.background_color
        Rectangle:
            size: self.size
            pos: self.pos

格式(xn)
不能在三重引号内,否则不会执行。似乎您试图将新的
标签
动态添加到现有的
DarkL
LightL
,但它们不是小部件容器,因此我将其更改为
BoxLayout
,以证明其有效。

感谢您的回复!在试图简化代码时,我注意到我犯了一些乱七八糟的错误。我对kivy和python还比较陌生,所以请原谅这些简单的错误。我调整了以下内容:`self.root=Builder.loadString(..)`
def build(self):self.AddLabel()返回self.root
如果更改正确,我将得到一个AttributeError:'super'对象没有属性'getattr'。我不确定这到底意味着什么。我想知道的是,我试图为每个for循环创建一个暗标签和亮标签。现在看起来它只会创建两个标签(?),有没有办法将暗/光格式指定给新创建的标签?最后,我想知道您在BoxLayout中做了哪些更改(很抱歉收到垃圾邮件……),如果在
build()
方法中调用
AddLabel()
,那么
ids
将不可用。这会导致
属性错误
。您必须等待调用
AddLabel()
,直到
App
实际完成安装并运行。使用像
按钮或
时钟这样的想法。计划一次()
触发
AddLabel()
。如果你想让循环创建暗
标签和亮
标签
,那么只要将
标签
替换为
DarkL
LightL
在循环内部,如果
AddLabel()
。我正在慢慢地得到它,谢谢你的帮助!因此,我添加了一个按钮(更改了
BoxLayout
中的
标签,该按钮的文本为
右下角
,并在发布时添加了
:app.AddLabel()
,但是我得到了以下错误:
在AddLabel self.root.ids.DynBox.add小部件(Builder.load\u字符串(''File“kivy\properties.pyx”)中,第863行,kivy.properties.observedict.\uuuu getattr\uuuuuuuuuuu属性错误:“超级”对象没有属性\uuuuu getattr\uuuuuuuu
我想我忘了什么,但不确定是什么。我的程序结构乱七八糟,层很奇怪。按照John提到的方法重写并调整它。包括标签上的颜色!
    def AddLabel(self, *arg):
        for xn in range(0, 8):
            self.root.ids.DynBox.add_widget(Builder.load_string('''
Label:
    text:
        ''' + '\'{}\''.format(xn)
))
            self.root.ids.DynBox.add_widget(Builder.load_string('''
Label:
    text:
        ''' + '\'{}\''.format(xn)
))