You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止在Kivymd MDTextField中输入负数?

解决MDTextField禁止输入负号的问题

默认的float或int输入过滤器允许输入负号,要实现输入减号无响应,可通过以下两种方式处理:

方法一:自定义输入过滤器(推荐)

在Python代码中定义一个只允许非负数字(含小数点,若需整数则去掉小数点逻辑)的过滤函数,绑定到MDTextField的input_filter属性:

Python代码部分

from kivy.app import App
from kivymd.app import MDApp

class YourApp(MDApp):
    def non_negative_float_filter(self, text, from_undo):
        # 仅保留数字和小数点
        filtered_chars = [c for c in text if c.isdigit() or c == '.']
        filtered_text = ''.join(filtered_chars)
        # 处理多个小数点的情况,只保留第一个
        if '.' in filtered_text:
            parts = filtered_text.split('.')
            filtered_text = parts[0] + '.' + ''.join(parts[1:])
        return filtered_text

    def prochnjst(self):
        # 你的验证逻辑
        pass

if __name__ == "__main__":
    YourApp().run()

KV语言部分

MDTextField:
    id: z1_m
    text:""
    hint_text: "z1"
    helper_text: "Число зубьев шестерни"                        
    helper_text_mode: "on_focus"
    input_filter: app.non_negative_float_filter                                               
    on_text_validate: app.prochnjst()

这种方式会直接拦截负号输入,不会出现文本闪烁,体验更流畅。如果需要限制为非负整数,只需修改过滤函数,去掉小数点相关逻辑即可:

def non_negative_int_filter(self, text, from_undo):
    return ''.join([c for c in text if c.isdigit()])

方法二:监听文本变化移除负号

通过on_text事件实时检查文本内容,若包含负号则直接移除:

MDTextField:
    id: z1_m
    text:""
    hint_text: "z1"
    helper_text: "Число зубьев шестерни"                        
    helper_text_mode: "on_focus"
    input_filter: "float"                                               
    on_text:
        if '-' in self.text:
            self.text = self.text.replace('-', '')
    on_text_validate: app.prochnjst()

这种方式实现简单,但输入负号时会短暂显示后被移除,可能存在视觉闪烁。

内容的提问来源于stack exchange,提问作者Edem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:20:30