如何过滤或限制在PyGTK文本输入字段中输入的文本?

3 投票
1 回答
2444 浏览
提问于 2025-04-16 12:46

我想要一个文本输入框(gtk.Entry),这个输入框只能接受用户输入的十六进制字符作为有效输入。

1 个回答

9

你可以通过连接到'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()

撰写回答