Python: как установить фокус на динамическом TextInput - PullRequest
0 голосов
/ 10 мая 2018

Я использую python-2.7 и kivy.
Когда я запускаю 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 голосов
/ 10 мая 2018

Игнорировать первый столбец (значение1) каждой строки для пустого значения

  1. В файле kv удалите дочерние TextInput виджеты из класса Строка .
  2. В скрипте Python при создании первого виджета TextInput укажите id = 'value1' .

Пожалуйста, обратитесь к фрагментам ниже для деталей.

Отрывки

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;

Вывод - игнорировать первый столбец (значение1) каждой строки для пустого значения

Img01 Img02

Вывод - проверка TextInput каждой строки на пустое значение

Img01 Img02

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...