[pygtk] Re: adjust key bindings

Fabian Braennstroem f.braennstroem at gmx.de
Tue Nov 28 02:25:04 WST 2006


Hi John,

* On 25 Nov 2006 * John CORRY wrote:

> Fabian,
> 
> I have had a go at binding the "z" key to the down cursor key.  I can
> block the Z key press and assign the "down" cursor key press and print
> out the "down" key press but I can't redirect the signal back to the
> widget.  I have enclosed the code below, maybe someone else on the list
> can finish off the code.
> 
> The code below assumes that you have a window in Glade with one treeview
> widget.  Both widgets have the "key_press_event" assigned in glade.
> 
> import shutil
> import pygtk
> import findgtk
> import gtk
> import gtk.glade
> 
> import gobject
> import os
> import sys
> 
> class Shopcard:
>     
>     def __init__(self):
>         self.wTree = gtk.glade.XML ("project12.glade", "window1")
>         dic={"on_window1_delete_event" : self.quit100, }
>         self.wTree.signal_autoconnect (dic)
>         tree1 = self.wTree.get_widget("treeview1")
>         windy = self.wTree.get_widget("window1")
>         tree1.connect("key_press_event",self.callback3000,tree1,windy)
>         model = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
>         self.hostmodel = model
>         host_inter=self.insert_row(model,None,"test",'Test')
>         host_inter=self.insert_row(model,None,"test1",'Test')
>         host_inter=self.insert_row(model,None,"test2",'Test')
>         host_inter=self.insert_row(model,None,"test3",'Test')
>         host_inter=self.insert_row(model,None,"test4",'Test')
>         tree1.set_model(model)
>         renderer=gtk.CellRendererText()
>         column=gtk.TreeViewColumn("Col1",renderer,text=0)
>         column.set_resizable(True)
>         tree1.append_column(column)
>         renderer=gtk.CellRendererText()
>         column=gtk.TreeViewColumn("Col2",renderer,text=1)
>         column.set_resizable(True)
>         tree1.append_column(column)
> 
>     def insert_row(self,model,parent,firstcolumn,secondcolumn,
> thirdcolumn=None):
>         myiter=model.insert_after(parent,None)
>         model.set_value(myiter,0,firstcolumn)
>         model.set_value(myiter,1,secondcolumn)
>         if thirdcolumn !=None:
>             model.set_value(myiter,2,thirdcolumn)
>         return myiter
>         
>     
>     def callback3000(self,widget,event,tree1,windy):
>         import re
>         
>         """prevents the possibility of inputting wrong chars"""
>         ## fixme: missing comma, and cut&paste
>         key = gtk.gdk.keyval_name (event.keyval)
> 
>  
> ONLYDIGITS="([0-9.,z]|BackSpace|Left|Right|F1|period|Tab|Up|Down)"
>         if not re.match (ONLYDIGITS, key):
>             print "True"
>             return True
>         
>         else:
>             if key == "z":
>                 tree1.emit_stop_by_name("key_press_event") # This blocks
> the signal from the key press
>                 event = gtk.gdk.Event(gtk.gdk.KEY_PRESS)
>                 event.keyval = 65364 # This is the code for the down key
>                 
>                 
>                 event.state = gtk.gdk.CONTROL_MASK
>                 event.time = 0 # assign current time
>                 print gtk.gdk.keyval_name(event.keyval)
>                 tree1.emit('key_press_event', event)
>                 tree1.connect("key_press_event",self.callback3001)
> 
>             else:
>                 print event.keyval
>                 print "else"
>                 return False
>     def callback3001(self,widget,event):
>         import re
>         
>         """prevents the possibility of inputting wrong chars"""
>         ## fixme: missing comma, and cut&paste
>         key = gtk.gdk.keyval_name (event.keyval)
>         print key
>         print "made it"
>  
> ONLYDIGITS="([0-9.,z]|BackSpace|Left|Right|F1|period|Tab|Up|Down)"
>         if not re.match (ONLYDIGITS, key):
>             print "True2"
>             return True
>     def quit(self,obj):
>         gtk.main_quit()
>         sys.exit(1)    
>     def quit100(self,obj,wind):
>         gtk.main_quit()
>         sys.exit(1)  
>         
> if __name__ == '__main__':
>     Shopcard()
>     try:
>         gtk.threads_init()
>     except:
>             print "No threading was enabled when you compiled pyGTK!"
>             import sys
>             sys.exit(1)
>     gtk.threads_enter()
>     gtk.main()
>     gtk.threads_leave()
> 

Thanks for the long example! Would be nice, if anybody knows
a way to connect the keybinding back to the widget, so it
moves the cursor...

Greetings!
Fabian


More information about the pygtk mailing list