[pygtk] Implementing command history with a gtk.Entry

Andi Albrecht lists at andialbrecht.de
Tue Jul 25 15:27:00 WST 2006


Hi,

I did something similar with a TreeView combined with a TextBuffer/View, 
here are the relevant parts of the code:

self.tv.connect("key-press-event", self.on_key_pressed)

def on_key_pressed(self, widget, event):
         if gtk.gdk.keyval_name(event.keyval) == "Down":
             self.select_next()
         elif gtk.gdk.keyval_name(event.keyval) == "Up":
             self.select_previous()
         else:
	    # write event character to your entry
	    # in this case I write them to a buffer
             c = chr(event.keyval)
             self.buffer.insert_at_cursor(c)
         return True # the event is handled, so return True

Andi

N. French wrote:
> Um, no I don't want completion behavior, I want to capture the up/down
> arrows from the gtk.Entry and act on them.
>  
> Thanks though.  Anyone else?
>  
>> --- Paul Malherbe <paul at tartan.co.za> wrote:
>>
>>
>>> Hi
>>>
>>> Here is a class I wrote which might help!
>>>
>>> Regards
>>>> #!/usr/bin/python
>>> try:
>>> 	import pygtk
>>> 	pygtk.require("2.0")
>>> 	import gtk, os, popen2, sys, time
>>> except:
>>> 	sys.exit()
>>>
>>> class RunPrg:
>>> 	def __init__(self, cmd):
>>> 		if cmd:
>>> 			self.runCmd(cmd)
>>> 		else:
>>> 			self.runProcess()
>>>
>>> 	def runProcess(self):
>>> 		win = gtk.Window()
>>> 		win.connect("destroy", self.destroy)
>>> 		win.connect("delete_event", self.destroy)
>>> 		win.connect("key_press_event", self.keyPress)
>>> 		hor = gtk.HBox(False, 0)
>>> 		lab = gtk.Label("Command")
>>> 		self.ent = gtk.Entry()
>>> 		self.aut = gtk.EntryCompletion()
>>> 		self.lst = gtk.ListStore(str)
>>> 		self.aut.set_model(self.lst)
>>> 		self.ent.set_completion(self.aut)
>>> 		self.aut.set_text_column(0)
>>> 		self.openFile()
>>> 		self.ent.connect("activate", self.getCmd, self.ent)
>>> 		self.aut.connect("match-selected", self.getCmd, self.ent)
>>> 		if self.last:
>>> 			self.ent.set_text(self.last)
>>> 		chk = gtk.CheckButton("Xterm")
>>> 		chk.connect("toggled", self.getCmd, self.ent)
>>> 		hor.pack_start(lab, False, False, 5)
>>> 		hor.pack_start(self.ent, False, False, 5)
>>> 		hor.pack_start(chk, False, False, 5)
>>> 		win.add(hor)
>>> 		win.show_all()
>>> 		win.set_position(gtk.WIN_POS_CENTER_ALWAYS)
>>> 		gtk.main()
>>>
>>> 	def keyPress(self, widget, data):
>>> 		while gtk.events_pending():
>>> 			gtk.main_iteration()
>>> 		keyname = gtk.gdk.keyval_name(data.keyval)
>>> 		if keyname == "Escape":
>>> 			self.destroy()
>>> 		elif keyname not in ("Up", "Down"):
>>> 			return
>>> 		elif not self.data:
>>> 			return
>>> 		if keyname == "Up":
>>> 			if self.pos == len(self.data):
>>> 				pass
>>> 			else:
>>> 				self.pos += 1
>>> 		elif self.pos:
>>> 			self.pos -= 1
>>> 		if self.pos == len(self.data):
>>> 			self.ent.set_text(self.last)
>>> 		else:
>>> 			self.ent.set_text(self.data[self.pos])
>>> 		self.ent.grab_focus()
>>>
>>> 	def openFile(self):
>>> 		self.lst.clear()
>>> 		self.data = []
>>> 		self.last = None
>>> 		home = os.environ.get("HOME")
>>> 		if not os.path.isfile("%s/.runprgrc" % home):
>>> 			self.file = open("%s/.runprgrc" % home, "w")
>>> 		else:
>>> 			self.file = open("%s/.runprgrc" % home, "r+")
>>> 			old = self.file.readlines()
>>> 			for line in old:
>>> 				self.last = line.replace("\n", "")
>>> 				if not self.data.count(self.last):
>>> 					self.data.append(self.last)
>>> 					self.lst.append([self.last])
>>> 		self.pos = len(self.data)
>>>
>>> 	def destroy(self, *args):
>>> 		gtk.main_quit()
>>> 		sys.exit()
>>>
>>> 	def getCmd(self, *args):
>>> 		gtk.main_quit()
>>> 		while gtk.events_pending():
>>> 			gtk.main_iteration()
>>> 		if type(args[0]) == gtk.CheckButton:
>>> 			xtm = args[0].get_active()
>>> 			cmd = args[1].get_text()
>>> 		elif type(args[0]) == gtk.EntryCompletion:
>>> 			xtm = False
>>> 			cmd = args[1][args[2]][0]
>>> 		else:
>>> 			xtm = False
>>> 			cmd = args[1].get_text()
>>> 		# Check if valid command and on path
>>> 		prg = cmd.split()[0]
>>> 		if os.path.exists(prg):
>>> 			yes = True
>>> 		else:
>>> 			yes = False
>>> 			path = os.environ["PATH"].split(":")
>>> 			for p in path:
>>> 				if os.path.exists(os.path.join(p, prg)):
>>> 					yes = True
>>> 		# Execute if valid
>>> 		if yes:
>>> 			if xtm:
>>> 				err = self.runCmd("exec xterm -e '%s|less'" % cmd)
>>> 			else:
>>> 				err = self.runCmd("%s" % cmd)
>>> 			if not err:
>>> 				self.file.write("%s\n" % cmd)
>>> 		# Exit
>>> 		self.file.close()
>>> 		sys.exit()
>>>
>>> 	def runCmd(self, cmd):
>>> 		try:
>>> 			fl1 = popen2.Popen3(cmd, True)
>>> 		except:
>>> 			return "error"
>>>
>>> if __name__ == "__main__":
>>> 	if len(sys.argv) > 1:
>>> 		inn = sys.argv[1:]
>>> 		cmd = inn[0]
>>> 		for c in inn[1:]:
>>> 			cmd = "%s %s" % (cmd, c)
>>> 	else:
>>> 		cmd = None
>>> 	RunPrg(cmd)
>>>
>>
>> __________________________________________________
>> Do You Yahoo!?
>> Tired of spam?  Yahoo! Mail has the best spam protection around 
>> http://mail.yahoo.com 
>>
> 
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com 
> _______________________________________________
> pygtk mailing list   pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/



More information about the pygtk mailing list