在将计算的数据更新到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: []
答案 0 :(得分:2)
有关详细信息,请参阅说明和示例。
使用input_filter: 'float'
。使用input_filter,您不必在方法中检查'init'或'float'。
input_filter
根据指定的模式过滤输入,如果不是None的话。如果 无,不应用过滤。
input_filter是一个ObjectProperty,默认为None。可以是以下之一 无,“ int”(字符串)或“ float”(字符串)或可调用项。如果是 “ int”,它将仅接受数字。如果它是“浮动的”,它也会 接受一个期间。最后,如果它是可调用的,它将被调用 有两个参数;要添加的字符串和指示布尔值 字符串是否是撤消(True)的结果。可赎回应 返回一个将用于替代的新子字符串。
在kv文件中,您为同一个根窗口小部件定义了一个根规则AddKalibrasieForm:
和类规则<AddKalibrasieForm>:
。由于您未使用def build()
方法,因此请删除kv文件中的类规则<AddKalibrasieForm>:
。
添加以下内容:
multiline: False # disable multiline
hint_text: "Slegs nommers" # Numbers only
input_filter: "float"
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")
要声明属性,必须在类级别声明它们。
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()
#: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: []