3

I have two file test.py and test.kv
In test.kv text: "+Add More" which add row dynamic vertical position.I am creating dynamic id in .py

self.add_widget(Row(button_text=str(self.row_count),id=str("test"+str(self.row_count))))

and in .kv file i am assigning id

id : root.id

Can anyone tell me how to get all dynamic value value1,value2,value3 in .py file
Any advise or guidance would be greatly appreciated..!!

[![enter image description here][1]][1]

test.py

from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty

Window.size = (450, 525)


class display(Screen):

    def add_more(self):
        self.ids.rows.add_row()

    def insert_value(self):
        print(Row().id)
        #print(self.ids.)



class Row(BoxLayout):
    button_text = StringProperty("")
    id = ObjectProperty(None)



class Rows(BoxLayout):
    orientation = "vertical"
    row_count = 0

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

    def add_row(self):
        self.row_count += 1
        self.add_widget(Row(button_text=str(self.row_count),id=str("test"+str(self.row_count))))


class test(App):

    def build(self):
        self.root = Builder.load_file('test.kv')
        return self.root

if __name__ == '__main__':
    test().run()

test.kv

<Row>:
    #state1 : state1
    orientation: "horizontal"
    spacing: 0, 5

    Button:
        text: root.button_text
        size_hint_x: .2

    TextInput:
        #text : root.id
        size_hint_x: .8
        id : root.id

display:

    BoxLayout:
        orientation: "vertical"
        padding : 20, 20

        BoxLayout:
            orientation: "horizontal"

            Button:
                size_hint_x: .2
                text: "+Add More"
                valign: 'bottom'
                on_press: root.add_more()


        BoxLayout:
            orientation: "horizontal"

            Label:
                size_hint_x: .2
                text: "SN"
                valign: 'bottom'

            Label:
                size_hint_x: .8
                text: "Value"
                valign: 'bottom'


        Rows:
            id: rows

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

            Button:
                text: 'Ok'
                on_release:
                    root.insert_value()

            Button:
                text: 'Cancel'
                on_release: root.dismiss()
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Nirdesh Kumawat
  • 386
  • 2
  • 16
  • 56

1 Answers1

2

First you must access Rows for it we use ids since he has an id:

    Rows:
        id: rows

Then you access each Row through children since when you use add_widget is stored in this ListProperty, and the same is done with Row but isinstance() is used to filter the TextInput, after that the text is obtained and added to the list.

It should be noted that the oldest children are at the end because of it reversed() is used.

from kivy.uix.textinput import TextInput
[...]

    def insert_value(self):
        values = []
        rows = self.ids.rows
        for row in reversed(rows.children):
            for ch in row.children:
                if isinstance(ch, TextInput):
                    values.append(ch.text)
        print(values)
eyllanesc
  • 235,170
  • 19
  • 170
  • 241