使用kivy在运行时生成标签

2024-09-27 07:19:15 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我目前在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')



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


Tags: selfdatadef标签labelclassprintstringproperty
1条回答
网友
1楼 · 发布于 2024-09-27 07:19:15

你的代码不是一个最小的运行示例。 我看不到你在哪里添加标签到小部件。 标签只有一个文本方法

在第一个示例中,我将尝试修复您的代码。 启动小部件时使用 data = LableInfo() 但在该方法结束之前,不要将其添加到sortiescreen()

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

相关问题 更多 >

    热门问题