Как я могу добавить строку в scrollview в Киви, используя данные из списка? Питон

#python #kivy #row #scrollview #add

Вопрос:

Я делаю приложение для инвентаризации для работы. У меня есть список из 4 элементов, который обновляется, когда пользователь приложения заказывает новую деталь (серийный номер, описание товара, заказанное количество, дата заказа). Когда клиент нажимает «Отправить заказ» во всплывающем окне, список обновляется всеми соответствующими данными.

Затем появится еще один экран под названием «По заказу», который будет отображать эти данные в динамических строках по 5 столбцов в каждой (кнопка с текстом «Получено» будет 5-м столбцом, который удалит строку с экрана при нажатии). Я хотел бы иметь кнопку обновления, которая заполнит экран новой строкой (содержащей 5 столбцов: 4 метки и 1 кнопку), если в списке содержатся данные.

Мне удалось создать список просто отлично, и я могу добавлять новые строки, когда нажимаю «Обновить», но я все еще не могу динамически обновлять метки, он по-прежнему просто отображает текст, заключенный в кавычки в файле kv (я пытался удалить этот текст полностью, но тогда метки просто пустые). У меня есть класс строк, в котором я попытался установить идентификаторы меток, равные индексам списка, это работает просто отлично и даже выводится на печать в консоли, но он не обновляет метки, и я не могу понять, почему.

Я могу сказать, что мне просто не хватает одной или двух частей информации, которые помогут мне заставить это работать. Любая помощь была бы очень признательна.

Вот соответствующие классы из main.py:

 class Row(BoxLayout):
    button_text = StringProperty("")
    #populate_onOrder is the list that contains serial number, item description, quantity ordered, and date
    global populate_onOrder

    def __init__(self, **kwargs):
        super(Row, self).__init__(**kwargs)

    #This method is called when the 'Submit Order' btn is pressed on another screen (a popup)
    def pop_row_ids(self):
        self.ids.sn.text = str(populate_onOrder[0])
        self.ids.pn.text = str(populate_onOrder[1])
        self.ids.qo.text = str(populate_onOrder[2])
        self.ids.date.text = str(populate_onOrder[3])
        print(self.ids.sn.text, self.ids.pn.text, self.ids.qo.text, self.ids.date.text)


class Rows(BoxLayout):
    row_count = 0

    def __init__(self, **kwargs):
        super(Rows, self).__init__(**kwargs)
        self.add_row()

    #This is copy/pasted code that adds a row for me
    def add_row(self):
        self.row_count  = 1
        self.add_widget(Row(button_text=str(self.row_count)))


class OnOrderWindow(Screen):
    global populate_onOrder
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def add_more(self):
        if not populate_onOrder: #if this list is empty, nothing is being ordered so don't add row
            pass
        else:
            self.ids.rows.add_row()
            populate_onOrder.clear()
 

Это мой файл kv:

 <Row>:
    size_hint_y: None
    height: self.minimum_height
    height: 40

    sn:sn
    pn:pn
    qo:qo
    date:date

#These labels need to be updated dynamically
    Label:
        id: sn
        text: "Serial"
    Label:
        id: pn
        text: "Item Desc"
    Label:
        id: qo
        text: "qty"
    Label:
        id: date
        text:"date"
    Button:
        text: "Received"

<Rows>:
    size_hint_y: None
    height: self.minimum_height
    orientation: "vertical"

<SV>:
    #size_hint: .75, 1
    size_hint: None, None
    size: 500, 320
    pos_hint: {'center_x': .5, 'center_y': .5}
    do_scroll_x: False

<OnOrderLabel@Label>:
    size_hint_x: .2
    text_size: self.size
    valign: 'bottom'
    halign: 'center'

<OnOrderWindow>:
    name: "on_order_window"
    BoxLayout:
        orientation: "vertical"
        padding : 20, 5

        BoxLayout:
            orientation: "horizontal"
            #padding : 10, 10
            spacing: 10, 10
            size: 450, 40
            size_hint: None, None

            OnOrderLabel:
                text: "SN"

            OnOrderLabel:
                text: "Item Description"

            OnOrderLabel:
                text: "Order Qty"

            OnOrderLabel:
                text: "Date Ordered"

        ScrollView:
            Rows:
                id: rows

        BoxLayout:
            orientation: "horizontal"
            size_hint_x: .2
            size_hint_y: .2

            Button:
                text: "Refresh"
                on_press: root.add_more()

        BoxLayout:
            orientation: "horizontal"
            padding : 10, 5
            spacing: 10, 10
            size_hint: .5, .35
            pos_hint: {'x': .25, 'y':.25}

            Button:
                text: 'iQue Inventory'
                on_release:
                    app.root.current = "inv_window"
                    root.manager.transition.direction = "right"

            Button:
                text: 'Add Part to Inventory'
                on_release:
                    app.root.current = "add_part_window"
                    root.manager.transition.direction = "left"

 

Screenshot of the ‘On Order’ Screen