在接受输入之前,先将输入的Kivy TextInput验证为数据类型整数

时间:2018-08-03 20:16:08

标签: python python-3.x kivy

在将计算的数据更新到ListView之前,我试图在对Input的值进行计算之前验证Kivy中的TextInput。但是,当我通过打印输出来测试第一个TextInput值时,没有任何结果,没有错误,也没有结果。我在Kivy文件中引用了on_press root.calvariable方法AddKalibrasieForm类,但仍然没有。有人可以告诉我我做错了什么吗?

编辑:我注意到我做错了:我导入TextInput时未声明Class(已将其删除),并且未以正确的方法(已修复)声明val_lewerha TextInput对象,因此将其打印到控制台。我的问题已更改为您可以验证用户在输入时的输入吗?这叫on_focus吗?例如我认为应该采用哪种方法才能达到预期效果:

def validate_input(self):
    if isinstance(self.textinput, (int, float)):
        accept self.textinput
    else:
        make self.textinput color red as incorrect data type

2nd Edit:我一定错过了,但是另外两个Stack Overflow Q&A让我得到了正确的答案, Stack_Overflow_Answer1; Stack_Overflow_Answer2。 我还浏览了Kivy文档,该文档显示了一个示例,该示例仅允许在插入文本时在TextInput中使用浮点数和一个点 Kivy1.11.0_TextInput_Documentation。这样我就可以解决它。 @eyllanesc:我只想允许用户在TextInput中插入浮点“ 0-9”,不能输入任何字符串。谢谢。如何将此标记为已回答?

这是我的Python3代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

class AddKalibrasieForm(BoxLayout):
    calculated_results = ObjectProperty()

    def convert_calvariables(self):
        val_lewerha = ObjectProperty()
        not_filled_in = ""
        flowha = float(self.val_lewerha.text)
        if flowha != not_filled_in and isinstance(flowha, (int, float)):
            print(format(self.val_lewerha.text))
        else:
            print("Error")

class CalibrationApp(App):
    pass

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

这是我Kivy文件的一部分:Calibration.kv

AddKalibrasieForm:

<AddKalibrasieForm>:
    orientation: "vertical"
    val_lewerha: volha_box
    calculated_results: calculated_results_table
    BoxLayout:
        height: "40dp"
        size_hint_y: None
        Label:
            text: "Lewering per ha"
            size_hint_x: 25
        TextInput:
            id: volha_box #TextInput object name
            size_hint_x: 50
        Label:
            text: "liter"
            size_hint_x: 25
            text_size: self.size
            halign: "left"
    BoxLayout:
        height: "60dp"
        size_hint_y: None
        Label:
            size_hint_x: 35
        Button:
            text: "Bereken"
            size_hint_x: 30
            on_press: root.convert_calvariables() #method called on_press
        Label:
            size_hint_x: 35
    ListView:
        id: calculated_results_table
        table_items: []

1 个答案:

答案 0 :(得分:2)

有关详细信息,请参阅说明和示例。

TextInput-input_filter

使用input_filter: 'float'。使用input_filter,您不必在方法中检查'init'或'float'。

input_filter

input_filter
     

根据指定的模式过滤输入,如果不是None的话。如果   无,不应用过滤。

     

input_filter是一个ObjectProperty,默认为None。可以是以下之一   无,“ int”(字符串)或“ float”(字符串)或可调用项。如果是   “ int”,它将仅接受数字。如果它是“浮动的”,它也会   接受一个期间。最后,如果它是可调用的,它将被调用   有两个参数;要添加的字符串和指示布尔值   字符串是否是撤消(True)的结果。可赎回应   返回一个将用于替代的新子字符串。

kv文件

定义了两个根

在kv文件中,您为同一个根窗口小部件定义了一个根规则AddKalibrasieForm:和类规则<AddKalibrasieForm>:。由于您未使用def build()方法,因此请删除kv文件中的类规则<AddKalibrasieForm>:

TextInput-volha_box

添加以下内容:

  • multiline: False # disable multiline
  • hint_text: "Slegs nommers" # Numbers only
  • input_filter: "float"

Python代码

class AddKalibrasieForm(BoxLayout):
    calculated_results = ObjectProperty(None)
    val_lewerha = ObjectProperty(None)

    def convert_calvariables(self):
        if len(self.val_lewerha.text) > 0:   # if text is not empty
            print(format(self.val_lewerha.text))
        else:
            print("Error: Empty string")

Declaration of a Property

  

要声明属性,必须在类级别声明它们。

示例

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty


class AddKalibrasieForm(BoxLayout):
    calculated_results = ObjectProperty(None)
    val_lewerha = ObjectProperty(None)

    def convert_calvariables(self):
        if len(self.val_lewerha.text) > 0:   # if text is not empty
            print(format(self.val_lewerha.text))
        else:
            print("Error: Empty string")


class CalibrationApp(App):
    pass


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

calibration.kv

#:kivy 1.11.0

AddKalibrasieForm:  # root rule
    orientation: "vertical"
    val_lewerha: volha_box
    calculated_results: calculated_results_table

    BoxLayout:
        height: "40dp"
        size_hint_y: None

        Label:
            text: "Lewering per ha"
            size_hint_x: 25

        TextInput:
            id: volha_box   # TextInput object name
            size_hint_x: 50
            hint_text: "Slegs nommers"
            multiline: False
            input_filter: "float"

        Label:
            text: "liter"
            size_hint_x: 25
            text_size: self.size
            halign: "left"

    BoxLayout:
        height: "60dp"
        size_hint_y: None

        Label:
            size_hint_x: 35

        Button:
            text: "Bereken"
            size_hint_x: 30
            on_press: root.convert_calvariables()   # method called on_press

        Label:
            size_hint_x: 35

    ListView:
        id: calculated_results_table
        table_items: []

输出

Img01