Как получить запись Pygtk принимать только поплавки? - PullRequest
2 голосов
/ 06 сентября 2011

Я хочу, чтобы пользователь мог печатать только с плавающей запятой (то есть цифры от 0 до 9 и десятичная точка должны отображаться, другие символы не должны).Как я могу это сделать?

изменить Мне нужно получить значения, такие как "4" или "3.5" или ".9", ничего похожего на "10e23"

Несоответствуетзначения также должны быть отклонены, такие как "10.12.45" ...

Ответы [ 3 ]

2 голосов
/ 06 сентября 2011

Я наконец получил приемлемый ответ благодаря такому вопросу «Как извлечь плавающее число из строки в 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("")

подключено к «измененному» событию записи.Большое спасибо всем, кто помог.

1 голос
/ 06 сентября 2011

Я не уверен, что вы получите буфер от «измененного» события.

Однако было бы неплохо взглянуть на подключение к сигналу "preedit-change" в самой записи:

The "сигнал preedit-Changed "испускается, когда используется метод ввода, набранный текст не будет немедленно зафиксирован в буфере.Поэтому, если вас интересует текст, подключитесь к этому сигналу.

И затем, когда вы получите ввод, вы можете проверить его на правильность, а затем соответствующим образом манипулировать значением поля.

0 голосов
/ 06 сентября 2011

Поймать событие, которое сработало, когда пользователь изменяет значение в записи, и вручную проверить, что это число с плавающей точкой. Это может быть так же просто, как использовать 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
...