rendered paste body#!/usr/bin/env pythonimport timeimport pygtkpygtk.require('2.0')import gtkKEY_TAB = 65289class CompleterEntry(gtk.Entry): def __init__(self, completion_getter): gtk.Entry.__init__(self) self.completion_getter = completion_getter self.completion = gtk.EntryCompletion() self.completion.set_model(None) # EntryCompletion is overzealous. # Only give it a model when we've explicitly asked for completion. self.completion.set_inline_selection(True) self.set_completion(self.completion) self.completion.set_minimum_key_length(1) self.completion.set_text_column(0) self.connect('key-press-event', self.entry_keypress_cb) self.completion.connect('match-selected', self.match_cb) def entry_keypress_cb(self, widget, event): if event.keyval == KEY_TAB: liststore = self.completion_getter(self.get_text()) if len(liststore) == 1: self.set_text(liststore[0][0]) self.set_position(-1) else: self.completion.set_model(liststore) self.completion.complete() gtk.main_do_event(gtk.gdk.Event(gtk.gdk.KEY_PRESS)) return True else: self.completion.set_model(None) return False def match_cb(self, completion, model, iter): print model[iter][0], 'was selected' completion.set_model(None) returndef get_completion(prefix): print "TODO: Build completion list from DB" liststore = gtk.ListStore(str) for s in ['apple', 'banana', 'cap', 'comb', 'color', 'dog', 'doghouse']: if s.startswith(prefix): liststore.append([s]) return liststoreclass EntryCompletionExample: def __init__(self): window = gtk.Window() window.connect('destroy', lambda w: gtk.main_quit()) vbox = gtk.VBox() label = gtk.Label('Type a, b, c or d\nfor completion') vbox.pack_start(label) entry = CompleterEntry(get_completion) vbox.pack_start(entry) window.add(vbox) window.show_all() entry.connect('activate', self.activate_cb) return def activate_cb(self, entry): if entry.get_text(): print "TODO: Apply the tag" entry.set_text("") else: print "TODO: Go to the next image" returndef main(): gtk.main() returnif __name__ == "__main__": ee = EntryCompletionExample() main()