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()
精彩评论