Python / Kivy:获得动态添加文本框的价值

问题描述 投票:1回答:1

我有两个文件test.pytest.kv 在test.kv text: "+Add More"中添加行动态垂直位置。我在.py中创建动态id

self.add_widget(Row(button_text=str(self.row_count),id=str("test"+str(self.row_count))))

在.kv文件中,我正在分配ID

id : root.id

任何人都可以告诉我如何在value1,value2,value3文件中获取所有动态值.py 任何建议或指导将不胜感激.. !!

[![在此输入图片说明] [1]] [1]

test.py

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 BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty

Window.size = (450, 525)


class display(Screen):

    def add_more(self):
        self.ids.rows.add_row()

    def insert_value(self):
        print(Row().id)
        #print(self.ids.)



class Row(BoxLayout):
    button_text = StringProperty("")
    id = ObjectProperty(None)



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),id=str("test"+str(self.row_count))))


class test(App):

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

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

test.kv

<Row>:
    #state1 : state1
    orientation: "horizontal"
    spacing: 0, 5

    Button:
        text: root.button_text
        size_hint_x: .2

    TextInput:
        #text : root.id
        size_hint_x: .8
        id : root.id

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

            Button:
                text: 'Cancel'
                on_release: root.dismiss()
python python-3.x python-2.7 kivy kivy-language
1个回答
1
投票

首先你必须访问Rows我们使用id,因为他有一个id:

    Rows:
        id: rows

然后你通过孩子访问每个Row,因为当你使用add_widget时存储在这个ListProperty中,同样是用Row完成的,但isinstance()用于过滤TextInput,之后获取文本并添加到列表中。

应该指出的是,年龄最大的孩子最终因为使用了reversed()

from kivy.uix.textinput import TextInput
[...]

    def insert_value(self):
        values = []
        rows = self.ids.rows
        for row in reversed(rows.children):
            for ch in row.children:
                if isinstance(ch, TextInput):
                    values.append(ch.text)
        print(values)
© www.soinside.com 2019 - 2024. All rights reserved.