Search code examples
pythonpython-3.xpython-2.7kivykivy-language

Python : How to get value of dynmaic row


I am new to python and kivy.
I am trying to get value of dynamic row.But now i am getting value like this

Column2
Column1

Can someone tell me how to get value like this ?

1,column1,column2
2,column1,column2

Because i have three column in my database table like id,name,value and i want to insert value in database table through loop
I am using this code

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)
        lenArray = len(values)

        for x in range(0, lenArray):
            print (values[x])

demo.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
from kivy.uix.textinput import TextInput

Window.size = (450, 525)


class display(Screen):

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

    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)
        lenArray = len(values)

        for x in range(0, lenArray):
            print (values[x])



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('demo.kv')
        return self.root

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

demo.kv

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

    Button:
        text: root.button_text
        size_hint_x: .2

    TextInput:
        text:"Column1"
        size_hint_x: .8

    TextInput:
        text:"Column2"
        size_hint_x: .8
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()

Solution

  • To maintain a structure we must create a list of lists, then in each list the first parameter is the text of the Button that we filter through isinstance(), and the other elements are concatenated.

    [...]
    from kivy.uix.button import Button
    
    class display(Screen):
    
        def add_more(self):
            self.ids.rows.add_row()
    
        def insert_value(self):
            values = []
            rows = self.ids.rows
    
            for row in reversed(rows.children):
                vals = []
                for ch in reversed(row.children):
                    if isinstance(ch, TextInput):
                        vals.append(ch.text)
                    if isinstance(ch, Button):
                        vals.insert(0, ch.text)
                values.append(vals)
    
            for val in values:
                print("{},{},{}".format(*val))
    
    [...]