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.

testButSwitch Off in esecuzione.
Dopo un click sul pulsante vedremo come segue.

testButSwitch On in esecuzione.
Se abbiamo avviato il nostro script da terminale possiamo leggere come segue.

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.

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!)