myButton (il seguito)

Continuiamo con la descrizione, del modulo myButton, iniziata nel precedente post.

myButSwitch

Il button switch è una variante del nostro button tradizione.

#-----------------------------------------------------------------------------
# myButSwitch
#-----------------------------------------------------------------------------
def myButSwitch(name=['my_ButSwitch',None], 
				icon=[Gtk.STOCK_NO, Gtk.STOCK_YES],
				call=None, data=[['dati 0'],['dati 1']],
				func=[None, None]):
	""" crea un bottone con 2 stati, ad ogni stato e'
		 associata una icona e una label
		 
		-> name nomi associati alle icone
		-> icon tipo di icone associate
		-> call funzione da eseguire su evento
		-> data dati da passare alla funzione
		-> func funzioni associate allo stato dello switch
	"""
	#callback debug    
	def on_clicked(widg, *data):
		"widg e' il riferimento dell'istanza"
		al = widg.get_children()[0] # alignment
		hb = al.get_children()[0]   # hbox
		image, text = hb.get_children()
		# verifica dello stato in base alla icona attuale
		if image.get_stock()[0] == widg.icon[0]:
			# switch On
			widg.props.image = Gtk.Image.new_from_stock(widg.icon[1], Gtk.ICON_SIZE_BUTTON)
			if widg.func[0]:
				widg.func[0](*data[0])
			try:
				if widg.labe[1] != None:
					widg.props.label = widg.labe[1]
			except:
				pass
			# update status
			widg.stat = 1
		else:
			# switch Off
			widg.props.image = Gtk.Image.new_from_stock(widg.icon[0], Gtk.ICON_SIZE_BUTTON)
			if widg.func[1]:
				widg.func[1](*data[1])
			widg.props.label = widg.labe[0]
			# update status
			widg.stat = 0
#button
	# istanzio un bottone
	butt = Gtk.Button(stock=icon[0])
	# reference icon
	butt.icon = icon
	# reference name
	butt.labe = name
	# reference function
	butt.func = func
	# reference status
	butt.stat = 0
	# lo rendo visibile
	butt.show()
	# modifico la label
	butt.props.image = butt.get_image()
	butt.props.label = name[0]
	
	# in assenza di callback usa quella di debug
	if call == None:
		call = on_clicked
	# passo il riferimento dell'oggetto stesso "butt"
	butt.connect('clicked', call, *data)
# <-        
	return butt,call

Abbiamo modificato gli attributi passati durante l’ istanza. La maggior parte di questi sono diventati delle liste per poter essere ripresi in base allo stato dell’ oggetto stesso.

Come potete notare dal codice sopra, usiamo la callback per poter alternare al volo la label dell’ oggetto stesso.

testButSwitch

Il codice del test, come sempre, aiuta in futuro a fare un copia e incolla da riportare nel nostro codice di sviluppo per partire da una base senza doversi ogni volta ricordare come poterlo sfruttare.

def testButSwitch():
#myButSwitch
	#ridefinisco le funzioni
	def buttOn(*data):
		print "On  adesso %s!" %data[0]
	def buttOff(*data):
		print "Off adesso %s!" %data[0]
	# butt,call
	obje, othe = myButSwitch(name=['_Off','_On',], 
							 icon=[Gtk.STOCK_NO, Gtk.STOCK_YES],
							 call=None, data=[['sono acceso'],['sono spento']],
							 func=[buttOn, buttOff]) 
	# abilito la vista dell'icona che di default è nascosta
	obje.set_always_show_image (True)    
# <-
	return obje

Se proviamo ad avviare il test otterremo quanto segue.

alternate text

testButSwitch Off in esecuzione.

Dopo un click sul pulsante vedremo come segue.

alternate text

testButSwitch On in esecuzione.

Se abbiamo avviato il nostro script da terminale possiamo leggere come segue.

alternate text

lettura nel terminale.

myButSwiFrame

Il button switch frame è una button switch inserito in un frame che però non ha label nel pulsante.

#-----------------------------------------------------------------------------
# myButSwitchFrame
#-----------------------------------------------------------------------------
def myButSwiFrame(name='myButSwitFrame', 
				  icon=[Gtk.STOCK_NO, Gtk.STOCK_YES],
				  call=None, data=[['dati 0'],['dati 1']],
				  func=[None, None],
				  bFra=1, sFra=Gtk.SHADOW_ETCHED_OUT, 
				  tFra='h', aFra=[False, False, 1]):
	""" crea un bottone con 2 stati all'interno di un frame,
		 ad ogni stato e' associata una icona
		 
		-> name nome associato alla label del frame
		-> icon tipo di icone associate
		-> call funzione da eseguire su evento
		-> data dati da passare alla funzione
		-> func funzioni associate allo stato dello switch
		-> bFra bordo riservato all'esterno
		-> sFra tipo di cornice
		-> tFra tipo di contenitore v/h 
		-> aFra attributi del contenitore
	"""
	#callback debug    
	def on_clicked(widg, *data):
		"widg e' il riferimento dell'istanza"
		al = widg.get_children()[0] # alignment
		hb = al.get_children()[0]   # hbox
		image, text = hb.get_children()
		# verifica dello stato in base alla icona attuale
		if image.get_stock()[0] == widg.icon[0]:
			# switch On
			widg.props.image = Gtk.Image.new_from_stock(widg.icon[1], Gtk.ICON_SIZE_BUTTON)
			if widg.func[0]:
				widg.func[0](*data[0])
			# update status
			widg.stat = 1
		else:
			# switch Off
			widg.props.image = Gtk.Image.new_from_stock(widg.icon[0], Gtk.ICON_SIZE_BUTTON)
			if widg.func[1]:
				widg.func[1](*data[1])
			# update status
			widg.stat = 0
#button
	# istanzio un bottone
	butt = Gtk.Button(stock=icon[0])
	# reference icon
	butt.icon = icon
	# reference name
	butt.labe = name
	# reference function
	butt.func = func
	# reference status
	butt.stat = 0
	# lo rendo visibile
	butt.show()
	# elimino la label
	butt.props.image = butt.get_image()
	butt.props.label = ""
#myFrame
	#fram,[labe,xBox]
	fram,othe = myFrame(name, butt, 'black', bFra, sFra, tFra, aFra)

	# in assenza di callback usa quella di debug
	if call == None:
		call = on_clicked
	# passo il riferimento dell'oggetto stesso "butt"
	butt.connect('clicked', call, *data)
# <-        
	#fram, [labe, xBox, butt, call]        
	return fram, [othe[0], othe[1], butt, call]

testButSwiFrame

Di seguito il codice per il test del nostro widget.

def testButSwiFrame():
#myButton
	# ridefinisco le funzioni
	def buttOn(*data):
		print "Adesso %s!" %data[0]
	def buttOff(*data):
		print "Adesso %s!" %data[0]
	# fram, [labe,xBox,butt,call]
	obje, othe = myButSwiFrame(name='myButSwitFrame', 
							   icon=[Gtk.STOCK_NO, Gtk.STOCK_YES],
							   call=None, data=[['sono acceso'],['sono spento']],
							   func=[buttOn, buttOff],
							   bFra=1, sFra=Gtk.SHADOW_ETCHED_OUT, 
                               # tFra='h', aFra=[False, False, 1])
							   tFra='h', aFra=[True, True, 1])
	# abilito la vista dell'icona che di default è nascosta
	othe[2].set_always_show_image (True)    
# <-
	return obje

Se proviamo ad avviare il test otterremo quanto segue.

alternate text

testButSwiFrame in esecuzione.

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
  myWind.py
  myApp.py

Per scaricare la nuova versione 20150902.zip

Saluti

Nel prossimo post vedremo il widget button check.

Ciao alla prossima. (stay tune!)