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:''
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()