我希望用户只能键入一个浮点数(即0到9之间的数字,小数点应该显示,其他字符不应该)。我怎么能这样做?
修改 我需要得到像“4”或“3.5”或“.9”这样的值,不像“10e23”
也应拒绝不一致的值,例如“10.12.45”......
答案 0 :(得分:2)
由于SO问题“如何从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)
在init部分,
和:
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("")
连接到条目的“已更改”事件。非常感谢所有帮助过的人。
答案 1 :(得分:1)
我不确定你是否会从“已更改”事件中获取缓冲区。
但是,看一下连接到条目本身中的信号"preedit-changed"可能是一个好主意:
使用输入法时会发出“preedit-changed”信号, 键入的文本不会立即提交到缓冲区。因此,如果 你对文本感兴趣,连接到这个信号。
然后当您获得输入时,您可以检查它是否有效,然后相应地操作字段值。
答案 2 :(得分:0)
当用户修改条目中的值时捕获事件,并手动验证它是否为浮点数。这可以像使用try
周围的float()
一样简单:
>>> 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