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.

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.

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