Python:如何将注意力集中在动态TextInput

时间:2018-05-10 17:49:00

标签: python-2.7 kivy

我正在使用python-2.7kivy 当我运行test.py时,屏幕看起来像附加图像。当我点击+Add More按钮时,行将添加dynamic。如果我在点击Ok按钮后填写附加图像之类的值,那么我可以使用此代码找到空白值TextInput

        a = 1
        for val in values:
            print(val)
            if val[1] == "":
                print("row"+str(a) +" TextInput 1 is required")
                break;

            if val[2] == "":
                print("row"+str(a) +" TextInput 2 is required")
                break;
            a = a+1

但有人可以告诉我如何将焦点设置为第一个空白TextInput,如附加图像。

enter image description here

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 StringProperty
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button

Window.size = (450, 525)


class display(Screen):

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

    def insert(self):

        values = []
        rows = self.ids.rows

        for row in reversed(rows.children):
            vals = []
            for ch in reversed(row.children):
                if isinstance(ch, TextInput):
                    vals.append(ch.text)
                if isinstance(ch, Button):
                    vals.insert(0, ch.text)
            values.append(vals)

        a = 1
        for val in values:
            print(val)
            if val[1] == "":
                print("row"+str(a) +" TextInput 1 is required")
                break;

            if val[2] == "":
                print("row"+str(a) +" TextInput 2 is required")
                break;
            a = a+1


class Row(BoxLayout):
    button_text = StringProperty("")

    def count_row(self):
        print('count row')


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


class test(App):

    def build(self):
        return self.root


test().run()

test.kv

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

    Button:
        text: root.button_text
        size_hint_x: .2

    TextInput:
        size_hint_x: .4

    TextInput:
        size_hint_x: .4
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: .4
                text: "Value1"
                valign: 'bottom'
            Label:
                size_hint_x: .4
                text: "Value2"
                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()

            Button:
                text: 'Cancel'
                on_release: root.dismiss()

1 个答案:

答案 0 :(得分:2)

忽略每行的第一列(value1)以获取空白值

  1. 在kv文件中,从类中删除子 TextInput 小部件。
  2. 在Python脚本中,在实例化第一个 TextInput 小部件时,提供 id ='value1'
  3. 有关详细信息,请参阅以下代码段。

    片段

    main.py

    class display(Screen):
    
        def add_more(self):
            self.ids.rows.add_row()
    
        def insert(self):
    
            rows = self.ids.rows
    
            for row in reversed(rows.children):
                for ch in reversed(row.children):
                    if isinstance(ch, TextInput):
                        if ch.text == "" and ch.id != 'value1':
                            print("\nch.id=", ch.id)
                            print("TextInput is required")
                            ch.focus = True
                            break;
    
    
    class Row(BoxLayout):
        button_text = StringProperty("")
    
        def __init__(self, **kwargs):
            super(Row, self).__init__(**kwargs)
            self.add_widget(TextInput(id="value1", size_hint_x=0.4))
            self.add_widget(TextInput(size_hint_x=0.4))
    

    test.kv

    <Row>:
        orientation: "horizontal"
        spacing: 0, 5
    
        Button:
            text: root.button_text
            size_hint_x: .2
    

    检查每行的TextInput是否为空白值

    解决方案如下:

    片段

    class display(Screen):
    
        def add_more(self):
            self.ids.rows.add_row()
    
        def insert(self):
    
            rows = self.ids.rows
    
            for row in reversed(rows.children):
                for ch in reversed(row.children):
                    if isinstance(ch, TextInput):
                        if ch.text == "":
                            print("TextInput is required")
                            ch.focus = True
                            break;
    

    输出 - 忽略空行值

    的每一行的第一列(value1)

    Img01 Img02

    输出 - 检查每行的TextInput是否为空白值

    Img01 Img02