2011-03-01 93 views

回答

7

過濾可以通過連接到'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()