【问题标题】:Python : add validation in formPython:在表单中添加验证
【发布时间】:2018-10-13 16:22:22
【问题描述】:

谁能告诉我如何在textInput上设置required验证
什么时候点击Ok按钮?
此时单击Ok 按钮,然后我会像这样检查每个TextInput
if self.name.text.strip() == "":
但是如果我的表单有多个50 feilds,那么这将是非常冗长的代码?有人可以告诉我另一种在TextInput 上设置required 验证的简短方法。

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'

【问题讨论】:

    标签: python-2.7 kivy


    【解决方案1】:
    1. 创建一个GridLayoutScrollView
    2. 使用循环创建由 LabelTextInput 小部件组成的表单的每一行
    3. 使用循环访问 self.container.children 中的子小部件。

    详情请参考以下示例。

    示例

    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'
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多