如何获得pygtk条目只接受浮动?

时间:2011-09-06 11:12:46

标签: python pygtk

我希望用户只能键入一个浮点数(即0到9之间的数字,小数点应该显示,其他字符不应该)。我怎么能这样做?

修改 我需要得到像“4”或“3.5”或“.9”这样的值,不像“10e23”

也应拒绝不一致的值,例如“10.12.45”......

3 个答案:

答案 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