KivyMD中max_text_length未限制输入,求3位整数严格输入方案
解决KivyMD MDTextField严格限制3位整数输入的问题
MDTextField的max_text_length属性仅提供视觉提示(文本变红),不会阻止超出长度的输入;默认的input_filter: 'int'仅限制输入整数,不控制长度。要实现只能输入3位整数(最多3位,输入过程中自动截断超出部分),同时可验证是否达到最少3位,可通过以下方法实现:
方法:自定义输入过滤器
自定义输入过滤器函数,同时实现整数限制和长度截断,替代默认的int过滤器:
完整代码示例
from kivy.lang import Builder from kivymd.app import MDApp def three_digit_int_filter(text, from_undo): # 过滤非数字字符,并截断到最多3位 filtered_text = ''.join([char for char in text if char.isdigit()])[:3] return filtered_text KV = ''' Screen: MDTextField: mode: "round" id: place input_filter: app.three_digit_int_filter hint_text: "3 Digit Number" valign: 'center' icon_right: "apps" size_hint_x: None width: 250 font_size: 18 pos_hint: {"center_x": 0.5} helper_text_mode: "on_error" MDRaisedButton: text: "提交" pos_hint: {"center_x": 0.5, "center_y": 0.4} on_press: app.validate_input() ''' class TestApp(MDApp): three_digit_int_filter = three_digit_int_filter def validate_input(self): # 验证输入是否为3位整数 input_text = self.root.ids.place.text if len(input_text) != 3: self.root.ids.place.error = True self.root.ids.place.helper_text = "请输入完整的3位数字" else: self.root.ids.place.error = False self.root.ids.place.helper_text = "" # 处理正确输入的逻辑 print(f"有效输入:{input_text}") def build(self): return Builder.load_string(KV) if __name__ == "__main__": TestApp().run()
代码说明
- 自定义过滤器:
three_digit_int_filter函数会实时过滤非数字字符,并将输入文本截断到最多3位,彻底阻止超出长度的输入。 - 提交验证:点击按钮触发
validate_input方法,检查输入长度是否为3位,不符合则显示错误提示。 - 移除原代码中的
max_text_length,因为自定义过滤器已实现长度限制,无需重复设置。
内容的提问来源于stack exchange,提问作者Marshall
相关产品推荐
相关产品推荐

