我正在尝试让添加按钮在 kivy 中添加另外 3 个文本输入框

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

如果某些部分使用我的语言,我很抱歉希望这无关紧要 当我按 'Add' 按钮添加另外 3 个文本输入时,就像 'Add' 按钮上的那些,我想保存放在这些文本输入框上的输入,但我想我自己可以理解。 我搜索但找不到有用的东西。这也是我第一次在这个级别上创建一些东西,如果它在某些方面效率低下,我们深表歉意。 这是 py 文件:

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

这是 kv 文件

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

我建议使用 ScrollView 来包含 TextInputs。您的 add() 方法可以是:

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

然后在 kv 中添加 PartsTextInputs 的规则以及包含它们的 ScrollView。这是修改后的 kv 的样子:

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