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:

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:

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

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:

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