Создание текстового поля pygtk, которое принимает только число - PullRequest
3 голосов
/ 28 апреля 2010

Кто-нибудь знает, как создать текстовое поле, используя PyGTK, который принимает только числа. Я использую Glade для создания своего пользовательского интерфейса.

Приветствия

Ответы [ 3 ]

7 голосов
/ 28 апреля 2010

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

Простой подход (не проверен, но должен работать):

class NumberEntry(gtk.Entry):
    def __init__(self):
        gtk.Entry.__init__(self)
        self.connect('changed', self.on_changed)

    def on_changed(self, *args):
        text = self.get_text().strip()
        self.set_text(''.join([i for i in text if i in '0123456789']))

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

EDIT
Поскольку вы, возможно, не захотите создавать свою запись в Python, я собираюсь показать вам простой способ «нумеровать» существующую.

    def numbify(widget):
        def filter_numbers(entry, *args):
            text = entry.get_text().strip()
            entry.set_text(''.join([i for i in text if i in '0123456789']))

        widget.connect('changed', filter_numbers)

    # Use gtk.Builder rather than glade, you'll need to change the format of your .glade file in Glade accordingly
    builder = gtk.Builder()
    builder.add_from_file('yourprogram.glade')
    entry = builder.get_object('yourentry')

    numbify(entry)
4 голосов
/ 23 июня 2011

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

Посмотрите пример прядильной кнопки: http://www.pygtk.org/pygtk2tutorial/examples/spinbutton.py

0 голосов
/ 14 марта 2015

Преобразуйте ваш текст в число и, если он не обработает ошибку, установите текст в пустую строку.

Вы можете обобщить это, чтобы соответствовать регулярному выражению, как вы хотите

try:
    val = float(entry.get_text())
    entry.set_text(str(val))
except ValueError:
    entry.set_text('')
...