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

Python : How to add row dynamic


I am new to python/Kivy.
I have two files test.py and test.ky.
Now I am using two static row with serial number 1 and 2.
Can anyone tell me? How to add row dynamic when click on '+add more' button.Now 2 row shows which are static row with serial number increment.
I want add row dynamic 1 to 10 with serial number increment.

test.py

import kivy

from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window

Window.size = (450, 525)

class display(Screen):

    def add_more(self):
        print('test')

class test(App):

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


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

test.kv

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'

        BoxLayout:
            orientation: "horizontal"
            spacing: 0, 5

            Button:
                text: '1'
                size_hint_x: .2

            TextInput:
                size_hint_x: .8

        BoxLayout:
            orientation: "horizontal"
            spacing: 0, 5

            Button:
                text: '2'
                size_hint_x: .2

            TextInput:
                size_hint_x: .8

        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.dismiss()

            Button:
                text: 'Cancel'
                on_release: root.dismiss()

Can someone help me?


Solution

  • You can make a custom class for Row and Rows, then have a method adding rows.
    I modified your example a bit. Try this:

    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 StringProperty
    
    Window.size = (450, 525)
    
    
    class display(Screen):
    
        def add_more(self):
            self.ids.rows.add_row()
    
    
    class Row(BoxLayout):
        button_text = StringProperty("")
    
    
    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)))
    
    
    class test(App):
    
        def build(self):
            self.root = Builder.load_string(KV)
            return self.root
    
    
    
    KV = """
    
    <Row>:
        orientation: "horizontal"
        spacing: 0, 5
    
        Button:
            text: root.button_text
            size_hint_x: .2
    
        TextInput:
            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.dismiss()
    
                Button:
                    text: 'Cancel'
                    on_release: root.dismiss()
    
    """
    
    
    test().run()