Search code examples
pythonbuttonkivykivy-languagetextinput

i am trying to make the add button add another 3 textinput boxes in kivy


I am sorry if some parts are in my language hopefully it doesn't matter When I press the 'Add' button to add another 3 textinputs like those up the 'Add' button and I want to save the input that is put on those textinput boxes but I think I can figure that myself. I searched but couldn't find something useful. Also this is my first time creating something in this level so sorry if it is inefficient in some ways. This is the py file:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty


class MyGrid(GridLayout) :
    id_1 = ObjectProperty(None)
    id_2 = ObjectProperty(None)
    id_3 = ObjectProperty(None)
    id_4 = ObjectProperty(None)
    id_10 =ObjectProperty(None)

    def perfundo (self) :
        file = open('F:\\F\\F\\' + self.id_1.text + '-' + str(date.today()) + '.txt', 'x')
        file.write('Emri dhe mbiemri :' + self.id_1.text + '\n' + 'Lloji i vetures :' + self.id_2.text + '\n' + 'Nr. i telefonit :' + self.id_3.text + '\n' + 'Problemi :' + self.id_4.text)
        file.close()

    def add(self):
       self.id_10.text

class HAZApp(App) :
    def build (self) :
        return MyGrid()


app = HAZApp()
app.run()

and this is the kv file

<MyGrid>
id: HAZ
id_1: emridhembiemri
id_2:llojiivetures
id_3:numriitelefonit
id_4:problemi
id_10:add
rows: 10
padding: 10
spacing: 10
canvas.before:
    Rectangle:
        pos: self.pos
        size: self.size
        source: 'photo.jpg'

BoxLayout:
    canvas.before:
        Color:
            rgba: 0.4,0.5,0.8,1
        Rectangle:
            size: self.size
            pos: self.pos
    Label:
        font_size: '40sp'
        outline_color: 0, 0, 0
        outline_width: 2
        text: 'Auto Servis "Haziri"'

BoxLayout:
    spacing:10
    Label:
        text:"Name"
        font_size: 20
        color:0.4,0.5,0.8,1
    Label:
        text:"Type of car"
        font_size: 20
        color:0.4,0.5,0.8,1
    Label:
        text:"Phone number"
        font_size: 20
        color:0.4,0.5,0.8,1
    Label:
        text:"Problem"
        font_size: 20
        color:0.4,0.5,0.8,1

BoxLayout:
    spacing:20
    TextInput:
        font_size: 20
        id:emridhembiemri
    TextInput:
        font_size: 20
        id:llojiivetures
    TextInput:
        font_size: 20
        id:numriitelefonit
    TextInput:
        font_size: 20
        id:problemi

BoxLayout:
    spacing: 20
    column:2
    Label:
        text:'Parts'
        font_size: 20
        color:0.4,0.5,0.8,1
    BoxLayout:
        Label:
            text:'price for parts'
            font_size: 20
            color:0.4,0.5,0.8,1
        Label:
            text:'price for work'
            font_size: 20
            color:0.4,0.5,0.8,1


BoxLayout:
    spacing: 20
    column:2
    TextInput:
    BoxLayout:
        TextInput:
        TextInput:

BoxLayout:
    Button:
        id:add
        text:'Add'
        on_press:root.add()

BoxLayout:
    column:4
    Label:
        text:''
    Label:
        text:''
    Label:
        text:''
    Label:
        text:'Total'


BoxLayout:
    column:4
    Label:
        text:''
    Label:
        text:''
    Label:
        text:''
    Button:
        text:'total'

BoxLayout:
    Label:
        text:''
    Button:
        text:'Finish'
        font_size: 20
        on_press:root.perfundo()
        on_press: app.stop()
    Label:
        text:''

Solution

  • I recommend using a ScrollView to contain the TextInputs. Your add() method can be:

    def add(self):
        # Add a new PartsTextInputs inside the ScrollView
        self.ids.parts_text_inputs.add_widget(Factory.PartsTextInputs())
    

    Then add a rule for the PartsTextInputs in the kv as well as a ScrollView to contain them. Here is what a modified kv would look like:

    <PartsTextInputs@BoxLayout>:  # this is a rule for building the parts TextInputs
        size_hint_y: None
        height: self.minimum_height
        spacing: 20
        TextInput:
            size_hint_y: None
            height: 48
        BoxLayout:
            size_hint_y: None
            height: self.minimum_height
            TextInput:
                size_hint_y: None
                height: 48
            TextInput:
                size_hint_y: None
                height: 48
    <MyGrid>
        id: HAZ
        id_1: emridhembiemri
        id_2:llojiivetures
        id_3:numriitelefonit
        id_4:problemi
        id_10:add
        # rows: 10
        cols: 1
        padding: 10
        spacing: 10
        canvas.before:
            Rectangle:
                pos: self.pos
                size: self.size
                source: 'photo.jpg'
        
        BoxLayout:
            canvas.before:
                Color:
                    rgba: 0.4,0.5,0.8,1
                Rectangle:
                    size: self.size
                    pos: self.pos
            Label:
                font_size: '40sp'
                outline_color: 0, 0, 0
                outline_width: 2
                text: 'Auto Servis "Haziri"'
        
        BoxLayout:
            spacing:10
            Label:
                text:"Name"
                font_size: 20
                color:0.4,0.5,0.8,1
            Label:
                text:"Type of car"
                font_size: 20
                color:0.4,0.5,0.8,1
            Label:
                text:"Phone number"
                font_size: 20
                color:0.4,0.5,0.8,1
            Label:
                text:"Problem"
                font_size: 20
                color:0.4,0.5,0.8,1
        
        BoxLayout:
            spacing:20
            TextInput:
                font_size: 20
                id:emridhembiemri
            TextInput:
                font_size: 20
                id:llojiivetures
            TextInput:
                font_size: 20
                id:numriitelefonit
            TextInput:
                font_size: 20
                id:problemi
        
        BoxLayout:
            spacing: 20
            column:2
            Label:
                text:'Parts'
                font_size: 20
                color:0.4,0.5,0.8,1
            BoxLayout:
                Label:
                    text:'price for parts'
                    font_size: 20
                    color:0.4,0.5,0.8,1
                Label:
                    text:'price for work'
                    font_size: 20
                    color:0.4,0.5,0.8,1
                    
        ScrollView:
            size_hint_y: 3  # Since this is part of a GridLayout space is assigned by size_hint ratios
             
            BoxLayout:
                id: parts_text_inputs  # this will contain all the parts TextInputs
                orientation: 'vertical'
                size_hint_y: None
                height: self.minimum_height
                
                PartsTextInputs:   # this is the first of the parts TextInputs
        
        BoxLayout:
            Button:
                id:add
                text:'Add'
                on_press:root.add()
        
        BoxLayout:
            column:4
            Label:
                text:''
            Label:
                text:''
            Label:
                text:''
            Label:
                text:'Total'
        
        
        BoxLayout:
            column:4
            Label:
                text:''
            Label:
                text:''
            Label:
                text:''
            Button:
                text:'total'
        
        BoxLayout:
            Label:
                text:''
            Button:
                text:'Finish'
                font_size: 20
                on_press:root.perfundo()
                on_press: app.stop()
            Label:
                text:''