Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
403 views
in Technique[技术] by (71.8m points)

kivy - Python : add validation in form

Can someone tell me that how to set required validation on textInput
when click on Ok button?
At this time click on Ok button then i check every TextInput like that.
if self.name.text.strip() == "":
But if my form have more than 50 feilds then it will be very lengthy code?Can someone tell me another short way to set required validation on TextInput.

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.properties import ObjectProperty
from kivy.uix.textinput import TextInput
Window.size = (500, 330)

class FloatInput(TextInput):

    def __init__(self, **kwargs):
        super(FloatInput, self).__init__(**kwargs)

    def on_text(self, instance, text):
        if text !="":
            print(text)

class TestScreen(Screen):
    name = ObjectProperty(None)
    clas = ObjectProperty(None)

    def check_validation(self):
        if self.name.text.strip() == "":
            print("Name is blank")
        elif self.clas.text.strip() == "":
            print("clas is blank")



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


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

test.kv

#:kivy 1.10.0
TestScreen:
    name:name
    clas:clas

    GridLayout:
        cols: 2
        padding : 30,30
        spacing: 10, 10
        row_default_height: '40dp'

        Label:
            text: 'Name'

        FloatInput:
            id: name

        Label:
            text: 'Class'

        FloatInput:
            id: clas


        Button:
            text: 'Ok'
            on_release: root.check_validation()

        Button:
            text: 'Cancel'
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
  1. Create a ScrollView of GridLayout
  2. Use a loop to create each line of the form consisting of a Label and TextInput widgets
  3. Use a loop to access child widget in self.container.children.

Please refer to the example below for details.

Example

main.py

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.metrics import dp
from kivy.properties import ObjectProperty, DictProperty

Window.size = (500, 330)


class FloatInput(TextInput):

    def on_text(self, instance, text):
        if text != "":
            print("id={0}, text={1}".format(instance.id, text))


class TestScreen(Screen):
    container = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(TestScreen, self).__init__(**kwargs)
        self.container.bind(minimum_height=self.container.setter('height'))
        self.create_form()

    def create_form(self):
        # create 50 labels and text inputs
        for i in range(50):
            label = Label(text="Label {}".format(i), size_hint_y=None, height=dp(40))
            text_input = FloatInput(id=str(i), hint_text="TextInput {}".format(i), size_hint_y=None, height=dp(40))
            self.container.add_widget(label)
            self.container.add_widget(text_input)

    def check_validation(self):
        for child in reversed(self.container.children):
            if isinstance(child, Label):
                label_text = child.text
            if isinstance(child, FloatInput):
                if child.text.strip() == "":
                    print("{0} - TextInput is blank, obj={1}".format(label_text, child))


class Test(App):
    def build(self):
        return TestScreen()


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

test.kv

#:kivy 1.10.0

<TestScreen>:
    container: container

    BoxLayout:
        orientation: 'vertical'

        BoxLayout:
            orientation: 'vertical'

            ScrollView:

                GridLayout:
                    id: container
                    cols: 2
                    size_hint_y: None
                    padding : 30,30
                    spacing: 10, 10

        BoxLayout:
            size_hint_y: 0.2

            Button:
                text: 'Ok'
                on_release: root.check_validation()

            Button:
                text: 'Cancel'

Output

Img01 - OK button clicked


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...