Создание меток во время выполнения с использованием KIVY - PullRequest
0 голосов
/ 20 октября 2019

Здравствуйте. В настоящее время у меня есть окно в 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 Ответ

1 голос
/ 20 октября 2019

Ваш код не является минимальным рабочим примером. Я не вижу, где вы добавляете свой ярлык в виджет. Метка имеет только один текстовый метод.

В этом первом примере я попытаюсь исправить ваш код. Вы запускаете свой виджет с помощью 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 . С примером документации вы можете ознакомиться по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...