在python中动态添加.kv childwidget
我试图在python中的另一个(网格)布局小部件中动态添加标签(在本例中为LightL和DarkL) 我尝试使用IDs,但我不确定如何使用add_小部件实现它。 childlabels有一个背景色(矩形),我希望所有新创建的都是相同的格式在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
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)
))