你好,我目前有一个奇异的窗口,我试图在运行时生成标签,这需要在python中完成,因为每个标签中包含的文本都是在运行时生成的,并且标签的数量可以变化。目前,我有此设置:
class LabelInfo(Label):
textOne = StringProperty()
textTwo = StringProperty()
textThree = StringProperty()
textFour = StringProperty()
class SortieScreen(Screen):
from sortieData import SortieInfo
S = SortieInfo()
def label(self):
for i in range(0, len(self.S.sortieType)):
print("------------------")
data = LabelInfo()
data.textOne = self.S.sortieType[i]
print(data.textOne)
data.textTwo = self.S.sortieModifier[i]
print(data.textTwo)
data.textThree = self.S.modifierDesc[i]
print(data.textThree)
data.textFour = self.S.sortieNode[i]
print(data.textFour)
print("------------------")
data.size = 200, 200
data.pos = 100, (500 - (130 * i))
class WarframeInfo(App):
def build(self):
self.icon = 'Assets/icon.png'
self.title = "Warframe Info"
SortieScreen().label()
return Builder.load_file('warframeinfo.kv')
尽管运行没有错误,但是即使设置了大小和位置,屏幕上也不会生成标签。有人知道我在做什么错吗?任何帮助,将不胜感激。谢谢您的阅读!
答案 0 :(得分:1)
您的代码不是最低运行示例。 我看不到将标签添加到小部件的位置。 标签只有一种文本方法。
在第一个示例中,我将尝试修复您的代码。
您可以通过以下方式初始化小部件
data = LableInfo()
但是在该方法结束之前,您不要将其添加到SortieSecreen()
def label(self):
for i in range(0, len(self.S.sortieType)):
data = LabelInfo()
data.textOne = self.S.sortieType[i]
data.textTwo = self.S.sortieModifier[i]
data.textThree = self.S.modifierDesc[i]
data.textFour = self.S.sortieNode[i]
data.size = 200, 200
data.pos = 100, (500 - (130 * i))
self.add_widget(data) # here you add it
我也不知道这是否是在运行时添加内容的最佳方法。问题是,如果您创建许多数据小部件,则您的应用可能会冻结一段时间,以创建和添加数据小部件。
另一种方法是定义KV规则。如果您添加〜10-20个小部件,这将起作用。要了解更多,您的应用程序可能会延迟。
在kv文件中:
<MainView>:
# main layout stuff
<MyBoxLayout>:
orientation: 'vertical' #horizontal is default
Label:
text: root.label_0_text
Label:
text: root.label_1_text
Label:
text: root.label_2_text
Label:
text: root.label_3_text
,然后在您的py文件中:
class MainView (BoxLayout):
def __init__(self, **kwargs):
super(MainView, self).__init__(**kwargs)
for i in range(4):
lbl = MyBoxLayout()
lbl.label_0_text = str(i) # Label.text only accepts strings
lbl.label_1_text = str(i)
lbl.label_2_text = str(i)
lbl.label_3_text = str(i)
self.add_widget(lbl)
class MyBoxLayout(BoxLayout):
label_0_text = StringProperty()
label_1_text = StringProperty()
label_2_text = StringProperty()
label_3_text = StringProperty()
最好的方法是RecycledView。您可以在链接中参考文档示例。