All pastes #925826 Raw Copy code Copy link Edit

PyGTK Tab-completion

public python v1 · immutable
#925826 ·published 2008-03-03 10:05 UTC
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()