开发者

How can I filter or limit the text being entered in a PyGTK text entry field?

I want a text entry field (gtk.Entry)开发者_如何学运维 that accepts only hexadecimal characters as valid input from the user.


Filtering may be done by connecting to the 'insert_text' signal and manipulating the entered text in the signal handler.
Here is example code for validating Hex characters:

#!/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()
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜