Как я могу отфильтровать или ограничить текст, вводимый в поле ввода текста PyGTK? - PullRequest
2 голосов
/ 01 марта 2011

Мне нужно поле ввода текста (gtk.Entry), которое принимает только шестнадцатеричные символы в качестве допустимого ввода от пользователя.

1 Ответ

7 голосов
/ 01 марта 2011

Фильтрация может быть выполнена путем подключения к сигналу 'insert_text' и манипулирования введенным текстом в обработчике сигнала.
Вот пример кода для проверки шестнадцатеричных символов:

#!/usr/bin/env python
import gtk, pygtk, gobject, string

class HexEntry(gtk.Entry):
    """A PyGTK text entry field which allows only Hex characters to be entered"""

    def __init__(self):
        gtk.Entry.__init__(self)
        self.connect("changed", self.entryChanged)
        self.connect("insert_text", self.entryInsert)

    def entryChanged(self, entry):
        # Called only if the entry text has really changed.
        print "Entry changed"

    def entryInsert(self, entry, text, length, position):
        # Called when the user inserts some text, by typing or pasting.
        print "Text inserted"

        position = entry.get_position() # Because the method parameter 'position' is useless

        # Build a new string with allowed characters only.
        result = ''.join([c for c in text if c in string.hexdigits])

        # The above line could also be written like so (more readable but less efficient):
        # result = ''
        # for c in text:
        #     if c in string.hexdigits:
        #         result += c

        if result != '':
            # Insert the new text at cursor (and block the handler to avoid recursion).
            entry.handler_block_by_func(self.entryInsert)
            entry.insert_text(result, position)
            entry.handler_unblock_by_func(self.entryInsert)

            # Set the new cursor position immediately after the inserted text.
            new_pos = position + len(result)

            # Can't modify the cursor position from within this handler,
            # so we add it to be done at the end of the main loop:
            gobject.idle_add(entry.set_position, new_pos)

        # We handled the signal so stop it from being processed further.
        entry.stop_emission("insert_text")

def main():
    window = gtk.Window()
    window.connect("delete-event", gtk.main_quit)
    entry = HexEntry()
    window.add(entry)
    window.show_all()
    gtk.main()

if __name__ == "__main__":
    main()
...