Python:在表单中添加验证

时间:2018-05-03 11:09:05

标签: python-2.7 kivy

有人可以告诉我如何在required上设置textInput验证  点击Ok按钮时? 此时点击Ok按钮,然后我会检查每个TextInput  if self.name.text.strip() == "":
但是如果我的表单有超过50个字段,那么代码会非常冗长吗?有人可以告诉我另一个简短的方法来设置required上的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'

1 个答案:

答案 0 :(得分:1)

  1. 创建 GridLayout的 ScrollView
  2. 使用循环创建包含 Label TextInput 小部件的表单的每一行
  3. 使用循环访问 self.container.children 中的子窗口小部件。
  4. 详情请参阅以下示例。

    实施例

    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'
    

    输出

    Img01 - OK button clicked