使用Kivy在运行时生成标签

时间:2019-10-20 01:24:53

标签: python python-3.x kivy

你好,我目前有一个奇异的窗口,我试图在运行时生成标签,这需要在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')



尽管运行没有错误,但是即使设置了大小和位置,屏幕上也不会生成标签。有人知道我在做什么错吗?任何帮助,将不胜感激。谢谢您的阅读!

1 个答案:

答案 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。您可以在链接中参考文档示例。