[pygtk] getting the right focus

eric texier texiereric at yahoo.com
Thu May 25 13:01:52 WST 2006


Sorry if the example is too  long, it's not working the way I would
like. 
I would like to toggle visibility of the local menubar with a key
stroke('@'). but only until I enter 'return' in one of the entry, the
correct menubar(through its evenBox) is  getting the focus

There is 2 things that are happening that I don't understand:
- I only set a enter_notify_event callback, but button_press is
activing it too.
- why after grab_focus, I am not  getting the eventBox focus. Only
after activating the entry, I am getting the key press.

'@' (toggle the visibility of the local menubar)

Hope it's clear enough. I am also pretty newby at pygtk so if there
is better way to do that I will like to hear about it. For example,
it is possible to have accelerator on something else than a window?
Thanks,
Eric



#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk, gobject

class omGtkPanel(gtk.EventBox):

	def toggleVisibility(self,fs):
		vis = self._menubar.get_property("visible")
		if vis:
			self._menubar.hide()
		else:
			self._menubar.show()
	
	def selectFocus(self,panel,event):
		print "FFFFFFOCUS",panel
		self.grab_focus()
		return False
		
	def visibleMenuBar(self, panel,event):
		if (event.get_state() == gtk.gdk.SHIFT_MASK):
			print "in keyPress with shift"
			if gtk.gdk.keyval_name(event.keyval) == "at":
				self.toggleVisibility(0)
			return True
		return False
	
	def entryCb(self,wid):
		self._entry.set_editable(False)

	def selectEntryFocus(self,wid,foo):
		self._entry.set_editable(True)
		
	def show(self):
		self.realize()
		gtk.EventBox.show(self)
	
	
	def __init__(self,window):
		gtk.EventBox.__init__(self)
		vbox = gtk.VBox()
		self._vbox = vbox
		vbox.show()
		
		self._menubar = menubar = gtk.MenuBar()
		menubar.show()
		vbox.pack_start(menubar,False)
		
		panelMenu = gtk.MenuItem("Panel")
		panelMenu.show()
		
		menuTop = gtk.Menu()	
		
		optionMenu = gtk.MenuItem("Layout")
		optionMenu.show()
		
		submenuOption = gtk.Menu()	
		visMenuBar = gtk.CheckMenuItem("hide menu    shift @")
		visMenuBar.connect("activate",self.toggleVisibility)
		visMenuBar.show()
		submenuOption.append(visMenuBar)
		submenuOption.show()	
		
		optionMenu.set_submenu(submenuOption)
		
		menuTop.append(optionMenu)
		
		panelMenu.set_submenu(menuTop)
		menubar.append(panelMenu)
		
		frame = gtk.Frame("foo")
		
		frame.show()
		frame.set_size_request(110, 20)
		vbox.pack_start(frame,True)
		
		
		self._entry = entry = gtk.Entry()
		entry.set_text("")
		entry.set_activates_default(True)
		entry.connect("activate",self.entryCb)
		frame.add(entry)
		entry.set_editable(False)
		entry.add_events(gtk.gdk.BUTTON_PRESS_MASK)
		entry.connect("button_press_event",self.selectEntryFocus)
		entry.show()

		self.set_flags(gtk.CAN_DEFAULT & gtk.CAN_FOCUS)
		self.add_events(gtk.gdk.KEY_PRESS_MASK | 
						gtk.gdk.ENTER_NOTIFY_MASK)
		self.connect("key_press_event",self.visibleMenuBar)	
		#self.connect("button_press_event",self.selectFocus)
		self.connect("enter_notify_event",self.selectFocus)
		self.set_above_child(False)
		self.set_visible_window(False)
 
		self.add(vbox)

############################
class omGtkWindow(gtk.Window):
	def __init__(self,title):
		gtk.Window.__init__(self)
		self.set_title(title)
		self.set_default_size(200,200)
		self.connect("destroy", lambda w: gtk.main_quit())
############################
def main():
	gtk.main()
	return 0

############################
if __name__ == "__main__":
	window = omGtkWindow("testWindow")
	# create a vpaned widget and add it to our toplevel window
	vpaned = gtk.VPaned()
	window.add(vpaned)
	vpaned.show()
	

	panel = omGtkPanel(window)
	vpaned.add1(panel)
	panel.show()
	
	
	panel = omGtkPanel(window)
	vpaned.add2(panel)
	panel.show()
	vpaned.set_position(100)
	
	window.show()
	main()

Eric Texier
6, Rue Jean Baptiste Potin
92170 Vanves

Tel: 01 46 42 90 60
Mobile Reb: 06 81 06 44 74
Mobile Eric: 06 86 79 12 13


More information about the pygtk mailing list