如何让pygtk输入框只接受浮点数?

2 投票
3 回答
992 浏览
提问于 2025-04-17 01:34

我想让用户只能输入浮点数,也就是只能输入0到9之间的数字和小数点,其他字符都不允许输入。请问我该怎么做呢?

补充说明
我需要的值像是“4”或者“3.5”或者“.9”,而不是像“10e23”这样的。

不符合要求的值也要被拒绝,比如“10.12.45”这样的。

3 个回答

0

当用户修改输入框中的值时,捕捉这个事件,并手动检查这个值是否是一个浮点数(小数)。这其实很简单,只需要在 float() 周围加上一个 try

>>> float("1.4")
1.4
>>> float("1.4a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1.4a
>>> 

如果出现错误,就拒绝这个值。

补充:你也可以在用户输入字符的时候就过滤掉不合适的字符。

if newCharacter in "0123456789.":
    # valid
else
    # invalid
1

我不太确定你是否能从“改变”事件中获取到缓冲区。

不过,看看在输入框里连接一个叫做 “preedit-changed” 的信号可能是个好主意:

当使用输入法时,会触发“preedit-changed”信号,这时输入的文字不会立刻被写入缓冲区。所以如果你对文本感兴趣,可以连接这个信号。

然后当你获取到输入时,可以检查一下它是否有效,然后相应地调整字段的值。

2

我终于找到了一个可以接受的答案,这要感谢StackOverflow上的一个问题:“如何在Python中从字符串中提取浮点数”。

    numeric_const_pattern = r"""
    [-+]? # optional sign
    (?:
        (?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 etc 98.1 etc
        |
        (?: \d+ \.? ) # 1. 12. 123. etc 1 12 123 etc
    )
    # followed by optional exponent part if desired
    (?: [Ee] [+-]? \d+ ) ?
    """
    self.rx = re.compile(numeric_const_pattern, re.VERBOSE)

在初始化的部分,

还有:

def validate_float(self, widget, entry):
    entry_text = entry.get_text()
    newtext = self.rx.findall(entry_text)
    if len(newtext) :
        entry.set_text(newtext[0])
    else:
        entry.set_text("")

这个和输入框的“改变”事件连接在一起。非常感谢所有帮助过我的人。

撰写回答