Search code examples
pythonkivytextinput

Why does this save the same input in kivy?


So the code that is included saves a file based in the input given by the user and to make it a little better i decided to add an 'Add' button that is gonna create another 3 textinputs now i learned how to access them with id but it only saves the inputs in first 3 textinput boxes, i tried with a loop because i thought that when you took it the second time it might take the second input from the second 3 textboxes, but it didn't work.Ps sorry if the code is inefficient in some ways this is my first time making an app this is the py file

from datetime import date
from kivy.app import App
from kivy.factory import Factory
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty

t=1
lista=[]
class MyGrid(GridLayout) :
    id_1 = ObjectProperty(None)
    id_2 = ObjectProperty(None)
    id_3 = ObjectProperty(None)
    id_4 = ObjectProperty(None)
    id_10 = ObjectProperty(None)


    def add(self):
        self.ids.parts_text_inputs.add_widget(Factory.PartsTextInputs())
        global t
        t += 1

    def perfundo (self) :
        file = open('D:\\agron\\testing\\' + self.id_1.text + '-' + str(date.today()) + '.txt', 'x')
        global lista
        global t
        for i in range(0, t) :
            lista.append(self.ids.parts.ids.txtinp1.text)
            lista.append(self.ids.parts.ids.txtinp2.text)
            lista.append(self.ids.parts.ids.txtinp3.text)
        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+ '\n' + 'idk :' + str(lista))
        file.close()



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


app = HAZApp()
app.run()

and this is the kv file

<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
        id:txtinp1
    BoxLayout:
        size_hint_y: None
        height: self.minimum_height
        TextInput:
            size_hint_y: None
            height: 48
            id:txtinp2
        TextInput:
            size_hint_y: None
            height: 48
            id:txtinp3
<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: 'foto.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
            id:parts

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

  • You are getting the same output because the parts id is only assigned to the first PartsTextInputs (the one that is originally in your kv). So looping through that same object multiple times will just repeat the same data. You can access all the PartsTextInputs by looping through the children of the BoxLayout with the id of parts_text_inputs:

    def perfundo (self) :
        file = open('D:\\agron\\testing\\' + self.id_1.text + '-' + str(date.today()) + '.txt', 'x')
        global lista
        global t
    
        # get the list of all PartsTextInputs
        parts_prices = self.ids.parts_text_inputs.children[:]
    
        # reverse the list to get them in the samee order that you see on the screen
        parts_prices.reverse()
    
        # loop through all the PartsTextInputs
        for ti in parts_prices:
            lista.append(ti.ids.txtinp1.text)
            lista.append(ti.ids.txtinp2.text)
            lista.append(ti.ids.txtinp3.text)
            
        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+ '\n' + 'idk :' + str(lista))
        file.close()