boxEvent

Oggi voglio fare una premessa per giustificare il mio modo di operare. Qualcuno mi suggerisce di usare glade o altri Rad. A mio modesto avviso prima di usare dei rad e cosa buona e giusta fare un pò di gavetta e scriversi il codice a mano. Perchè così facendo si impara a fondo l’ambiente e si fa pratica nella programmazione. Poi alla fine si sarà in grado di valutare meglio quale strada percorrere.

myBoxEvent

#-----------------------------------------------------------------------------
# myBoxEvent
#-----------------------------------------------------------------------------
def myBoxEvent(name="myBoxEvent", 
			colo='yellow', font='Courier 10', 
			call=None, data=[]):
	""" crea un contenitore sensibile agli eventi con una label al suo interno
	 
		-> name nome associato alla label
		-> colo colore assegnato
		-> font font usato per il testo
		-> call funzione da eseguire su evento
		-> data dati da passare alla funzione
	"""
	#callback debug
	def on_clicked(widg, *data):
		print widg
#eventBox
	# istanzio l'oggetto
	eBox = Gtk.EventBox()
	# lo rendo visibile
	eBox.show()
	# associo un attributo
	eBox.status = [0]
	# imposto il colore di fondo
	eBox.modify_bg(Gtk.STATE_NORMAL, Gdk.color_parse(colo))
	# in assenza di callback uso quella di debug
	if call == None:
		call = on_clicked
	eBox.connect('button-release-event', call, *data)
#label
	if name:
		# istanzio l'oggetto
		labe = Gtk.Label(name)
		# lo rendo visibile
		labe.show()
		# imposto un font
		labe.modify_font(Pango.FontDescription(font))
		# aggiungo l'oggetto
		eBox.add(labe)
	else:
		labe = None
# <-
	return eBox, [labe, call]
#-----------------------------------------------------------------------------
def testBoxEvent():
	# ridefinisco la callback 
	def on_clicked(widg, *data):
		msg = widg.get_child().get_text()
		if msg == 'statusOn_':
			widg.status[0] = 0
			widg.modify_bg(Gtk.STATE_NORMAL, Gdk.color_parse("red"))
			widg.get_child().set_text('statusOff')
		else:
			widg.modify_bg(Gtk.STATE_NORMAL, Gdk.color_parse("green"))
			widg.get_child().set_text('statusOn_')
			widg.status[0] = 1
		print ("Off","On")[widg.status[0]]
	# <- eBox,[labe,call]
	obje, othe = myBoxEvent(name="statusOn_", 
						 colo='yellow', font='Courier 10', 
						 call=on_clicked, data=[])
#myFrame    
	# <- ram,[labe,xBox]
	obj1, oth1 = myFrame(name='myBoxEvent', obje=obje, colo='black',
						bord=2, shad=Gtk.SHADOW_ETCHED_OUT,
						tBox='v' )
# <-
	return obj1

Questo oggetto l’ ho costruito per avere la possibilità di avere un evento quando clicco col mouse sull’ area del contenitore. Per fare questo ho istanziato l’ oggetto EventBox che prevede questa caratteristica.

	# istanzio l'oggetto
	eBox = Gtk.EventBox()

Inoltre ho gestito la possibilità di cambiare colore allo sfondo che può essere utile per enfatizzare l’ evento stesso.

	# imposto il colore di fondo
	eBox.modify_bg(Gtk.STATE_NORMAL, Gdk.color_parse(colo))

Ed infine ho inserito una Label per assegnare se necessario un nome all’ area stessa.

	if name:
		# istanzio l'oggetto
		labe = Gtk.Label(name)

Se avviate il test testBoxEvent dovreste vedere come nella figura seguente.

alternate text

testBoxEvent in esecuzione.

Se provate a cliccare sull’ area colorata in giallo vedrete nel terminale il nome dello stato e nella GUI cambiare il colore in Verde o in Rosso in base allo stato dell’ oggetto.

myBoxEveList

Come per le altre tipologie di oggetti ho previsto la solita lista di oggetti omogenea.

#-----------------------------------------------------------------------------
# myBoxEveList
#-----------------------------------------------------------------------------
def myBoxEveList(name=["event00","event01"], 
			  cEve='yellow', fEve='Courier 10',
			  call=None, data=[],
			  tBox='v', aBox=[False, False, 1]):
	#callback debug
	def on_clicked(widg, eve, ind, *data):
		print "event%02d" %ind
	# in assenza di callback uso quella di debug
	if call == None:
		call = on_clicked
		
	# funzione che istanzia oggetti tipo
	def myList(ind):
#myEvent
		# eBox, [labe,call]
		return myBoxEvent(name[ind], 
					   cEve, fEve, call, [ind, data])
#myBoxList
	# <- xBox, [eBox, [labe,call]] * N
	obje, othe = myBoxList(name=name, tBox=tBox, 
						   aBox=aBox, func=myList)
# <-
	return obje, othe
#-----------------------------------------------------------------------------
def testBoxEveList():
#myEvent
	# xBox, [eBox, [labe,call]] * N
	obje, othe = myBoxEveList(name=["event00","event01","event02"], 
						   cEve='yellow', fEve='Courier 10',
						   call=None, data=[],
						   tBox='v', aBox=[False, False, 1])
	# cambio colore di fondo della seconda riga
	othe[1][0].modify_bg(Gtk.STATE_NORMAL, Gdk.color_parse("green"))
#myFrame    
	# <- fram,[labe,xBox]
	obj1, oth1 = myFrame(name='myEvent', obje=obje, colo='black',
						bord=2, shad=Gtk.SHADOW_ETCHED_OUT,
						tBox='v' )
	#debug
	# myViewObject(obje, othe)
# <-
	return obj1

Il passaggio di parametri iniziale è molto simile alle altre liste già viste. Per cui vi lascio alla meditazione leggendo e provando i 2 test possibili già previsti nel codice stesso.

Se avviate il test testBoxEveList dovreste vedere come nella figura seguente.

alternate text

testBoxEveList in esecuzione.

Se provate a cliccare nelle varie aree dovreste vedere nel terminale il nome dell’ area cliccata.

Package

La struttura e il link rimangono invariati rispetto al post myBox.

Per scaricare la versione 20150825.zip

Saluti

Nel prossimo post inizieremo a vedere i widgets del tipo Label.

Ciao alla prossima. (stay tune!)