myCheckButton

Il modulo my03ChkButton contiene una serie di widgets per la gestione dei check buttons che sono degli oggetti che permettono la selezione (attiva/disattiva) attraverso un click sopra l’ oggetto stesso.

myChkButton

E’ un oggetto che assume 2 stati come il nostro button switch ma con una grafica diversa.

Gli attributi passati durante l’ istanza sono valu che decide se lo stato deve essere vero/falso. Altro attributo è colo che decide di che colore deve essere la label del nostro oggetto.

#-----------------------------------------------------------------------------
# myCheckButton
#-----------------------------------------------------------------------------
def myChkButton(name='my_ChkButton', 
				valu=True, colo=None, 
				call=None, data=['dati']):
	""" crea un bottone di tipo check
		alla premuta del bottone viene eseguita la callback associata
	
		-> name nome associato alla label
		-> valu valore da associare
		-> colo colore assegnato al bottone
		-> call funzione da eseguire su evento
		-> data dati da passare alla funzione
	"""
	#callback debug
	def on_clicked(widg, *data):
		ena = widg.get_active()
		print "a) %s is %s" % (data, ("OFF", "ON")[ena])
		# change color
		#labe = widg.get_child()
		if widg.colo != None:
			if ena:
				widg.modify_fg(Gtk.STATE_NORMAL, Gdk.color_parse('green'))
				#labe.modify_fg(Gtk.STATE_NORMAL, Gdk.color_parse('green'))
			else:
				widg.modify_fg(Gtk.STATE_NORMAL, Gdk.color_parse('red'))
				#labe.modify_fg(Gtk.STATE_NORMAL, Gdk.color_parse('red'))

#chkButton    
	# istanzio l'oggetto
	butt = Gtk.CheckButton(name)
	# lo rendo visibile
	butt.show()
	# assegno il valore
	butt.set_active(valu)
	# assegno colore
	butt.colo = colo
	if colo != None:
		butt.modify_fg(Gtk.STATE_NORMAL, Gdk.color_parse(colo))
		
	# in assenza di callback usa quella di debug
	if call == None:
		call = on_clicked
	butt.connect('clicked', call, *data)
# <-
	return butt, call

testChkButton

Come possiamo vedere dal codice del test abbiamo forzato il colore a black per rendere più visibile la nostra label. Inoltre abbiamo inserito il nostro chkButton all’ interno di un frame per abbellire il tutto.

#-----------------------------------------------------------------------------
def testChkButton():
#myChkButton
	# ridefinisco la callback        
	def on_clicked(widg, name, *data):
		ena = widg.get_active()
		print "b) %s is %s" % (name, ("OFF", "ON")[ena])
	# butt, call
	obje, othe = myChkButton(name='Abilita', 
							 valu=False, colo='black', 
							# call= on_clicked, data=['myCheck',])
							 call= None, data=['myCheck',])
#myFrame    
	# fram,[labe,xBox]
	obj1, oth1 = myFrame(name='myChkButton', obje=obje, colo='black',
						 bord=2, shad=Gtk.SHADOW_ETCHED_OUT,
						 tBox='v' )
	#debug
	myViewObject(obje, [othe])
# <-
	return obj1

Se proviamo ad avviare il test vediamo:

alternate text

testChkButton in esecuzione.

Se proviamo a cliccare sul nostro chkButton vedremo il segno di spunta apparire ed inoltre cambiare il colore della label. Questo è fatto dalla callback di default poichè abbiamo scelto di non passare nulla durante l’ istanza call=None sebbene avvessimo ridefinito una nuova callback nell’ esempio.

myChkButList

Come al solito segue il metodo delle liste che ci torna utile nel caso dobbiamo definire una serie di widgets omogenei.

#-----------------------------------------------------------------------------
# myCheckButtonList
#-----------------------------------------------------------------------------
def myChkButList(name=["One","Two","Three"], 
				 valu=False, colo=None, 
				 call=None, data=['dati'],
				 tBox='h', aBox=[False, False, 1]):
	#callback debug
	def on_clicked(widg, ind, *data):
		ena = widg.get_active()
		print "a",
		print ind, data, ("OFF", "ON")[ena]
		
	# in assenza di callback uso quella di debug
	if call == None:
		call = on_clicked

	# funzione che istanzia oggetti tipo
	def myList(ind):
#myChkButton        
		# butt, [call,]
		return myChkButton(name=name[ind], 
							valu=False, colo=None, 
							call=call, data=[ind, data])
#myBoxList
	# xBox, [butt, call] * N
	obje, othe = myBoxList(name=name, tBox=tBox, 
						   aBox=aBox, func=myList)
# <-
	return obje, othe

testChkButList

def testChkButList():
#myChkButton    
	# ridefinisco la callback
	def on_clicked1(widg, ind, *data):
		ena = widg.get_active()
		print "%05s" %widg.props.label.replace('_',''), "is", ("OFF", "ON")[ena]
	# xBox, [butt, call] * N
	obje, othe = myChkButList(name=["Uno","Due","Tre"], 
							  valu=False, colo=None, 
							  call=on_clicked1, data=['uffi'],
							  tBox='v', aBox=[False, False, 1])
#myFrame    
	# fram,[labe,xBox]
	obj1, oth1 = myFrame(name='myButton', obje=obje, colo='black',
						 bord=2, shad=Gtk.SHADOW_ETCHED_OUT,
						 tBox='v' )
	#debug
	myViewObject(obje, othe)
# <-
	return obj1

Se proviamo ad avviare il test vedremo:

alternate text

testChkButList in esecuzione.

Se proviamo a modificare l’ attributo tBox=’h’ in tBox=’v’ otteniamo la stessa lista ma con allineamento verticale:

alternate text

testChkButList in esecuzione.

myChkButLisLabel

Per finire ho realizzato la stessa lista ma con una label in testa che può tornare utile in alcune situazioni

#-----------------------------------------------------------------------------
# myCheckButtonListLabel
#-----------------------------------------------------------------------------
def myChkButLisLabel(name=["One","Two","Three"], 
					 valu=False, colo=None, 
					 call=None, data=['dati'],
					 nLab='Label', cLab=None,
					 tBox='h', aBox=[False, False, 1]):
	"""     nLab name
			cLab color
	"""

	#callback debug
	def on_clicked(widg, ind, *data):
		ena = widg.get_active()
		print "a",
		print ind, data, ("OFF", "ON")[ena]
		
	# in assenza di callback uso quella di debug
	if call == None:
		call = on_clicked

	# funzione che istanzia oggetti tipo
	def myList(ind):
#myChkButton        
		# butt, call
		return myChkButton(name=name[ind], valu=False, colo=None, 
							call=None, data=[ind, data])
#myBoxList
	# xBox, [butt, call] * N
	obje, othe = myBoxList(name=name, tBox=tBox, 
						   aBox=aBox, func=myList)
#myLabel
	if cLab == None:
		cLab= 'blue'
	#name='myLabel', leng=0, prea=' ', post='', font='Arial 10', colo=Gdk.color_parse('black')
	labe = myLabel(name=nLab, 
				   leng=len(nLab)+1, prea=' ', post=' ', 
				   font='Courier 10', 
				   colo=cLab)
	# inserisco la label nella list degli oggetti
	othe.insert(0,[labe])
	# inserisco la label in testa alla box
	#child, expand=True, fill=True, padding=0
	obje.pack_start(labe, False, False, 0)
	obje.reorder_child(labe, 0)
# <-
	return obje, othe

testChkButLisLabel

							call=None, data=[ind, data])
#myBoxList
	# xBox, [butt, call] * N
	obje, othe = myBoxList(name=name, tBox=tBox, 
						   aBox=aBox, func=myList)
#myLabel
	if cLab == None:
		cLab= 'blue'
	#name='myLabel', leng=0, prea=' ', post='', font='Arial 10', colo=Gdk.color_parse('black')
	labe = myLabel(name=nLab, 
				   leng=len(nLab)+1, prea=' ', post=' ', 
				   font='Courier 10', 
				   colo=cLab)
	# inserisco la label nella list degli oggetti
	othe.insert(0,[labe])

Se proviamo ad avviare il test vediamo:

alternate text

testChkButLisLabel in esecuzione.

Nota

Vi invito per lo studio dei nostri widgets di avviarli sempre da terminale. Così potete visualizzare i messaggi in uscita fatti ad hoc per i nostri test.

Package

La struttura aggiornata del nostro package è la seguente:

l00_start.py
l01_startGtk.py
my00init.py
myWidg/
  __init__.py
  my00init.py
  my00initGtk.py
  my01Box.py
  my02Label.py
  my02Entry.py
  my02TxtView.py
  my03Button.py
  my03ChkButton.py
  myWind.py
  myApp.py

Per scaricare la nuova versione 20150903.zip

Saluti

Per oggi mi fermo qui.

Nel prossimo post vedremo i radio buttons.

Ciao alla prossima. (stay tune!)