[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