如何让pygtk输入框只接受浮点数?
我想让用户只能输入浮点数,也就是只能输入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("")
这个和输入框的“改变”事件连接在一起。非常感谢所有帮助过我的人。