Ottimizzazione dell’interfaccia d’uso della GtkLabel

L’interfaccia di esempio creata l’ultima volta si componeva di una serie di pulsanti che agivano su due metodi dell’etichetta, cambiando soltanto il parametro fornito alla funzione. Il codice risultante si presenta particolarmente ridondante, con tante microscopiche funzioni di una riga, una per ogni pulsante.

Cercheremo di ottimizzare l’interfaccia e soprattutto il codice che la governa, razionalizzando le funzioni e dandogli la possibilità di comportarsi diversamente a seconda del pulsante che è stato premuto.

Interfaccia per l'uso delle GtkLabelRiprendiamo il progetto e osserviamo le funzionalità: la prima fila di pulsanti svolge la stessa funzione: cambiare l’allineamento del testo mediante il richiamo del metodo set_justify, è quindi possibile raggruppare il codice dei primi 4 pulsanti in una sola funzione che chiameremo cambiaAllineamento.

La seconda fila di pulsanti nel codice richiama il metodo set_label passando alla funzione un testo racchiuso tra marcatori XML Pango, anche questi quattro pulsanti sono liberamente raggruppabili in una sola funzione chiamata cambiaStile.

Anche la terza fila di pulsanti svolge la stessa funzione della seconda, richiamando set_label con i tag Pango per ridurre e ingrandire il carattere, possiamo assimilarli alla seconda fila.

Nella quarta fila i pulsanti svolgono un’attività simile ma i primi due richiamano il metodo set_label con due testi, per cui solo per questi due pulsanti sarà usata una funzione differente da quella degli altri, chiamata cambiaStile2. Gli ultimi due pulsanti si comportano esattamente come gli altri.

Spostiamoci quindi alla scheda Segnali e per ogni pulsante modifichiamo la funzione di callback per il segnale clicked. Sulla prima fila di pulsanti assegniamo la funzione cambiaAllineamento, sui pulsanti Su e Giù assegniamo la funzione cambiaStile2, mentre per tutti gli altri pulsanti cambiaStile.

Salviamo il progetto Glade come label-2.glade e passiamo al codice Python che dovrà subire parecchie modifiche.

import gtk
import gtk.glade
import pygtk
pygtk.require("2.0")

gladeFile = gtk.glade.XML('label-2.glade')
window1 = gladeFile.get_widget('window1')
lblTesto = gladeFile.get_widget('lblTesto')
testo = lblTesto.get_text()

La sezione iniziale resterà immutata, cambierà soltanto il nome del file Glade.

allineamenti = {
  'btnAllineaSinistra': gtk.JUSTIFY_LEFT,
  'btnAllineaCentrato': gtk.JUSTIFY_CENTER, 
  'btnAllineaDestra': gtk.JUSTIFY_RIGHT,
  'btnAllineaGiustificato': gtk.JUSTIFY_FILL
}

Sarà creato un dizionario di nome allineamenti che conterrà nella chiave il nome del pulsante che lo richiama e sul valore la costante gtk usata per l’allineamento. Vedremo tra poco come sfruttare questo dizionario per rintracciare l’elemento voluto e quindi la corrispondente costante di allineamento.

stili = {
  'btnGrassetto': '<b>%s</b>',
  'btnCorsivo': '<i>%s</i>', 
  'btnSottolineato': '<u>%s</u>',
  'btnSbarrato': '<s>%s</s>', 
  'btnRiduci': '<small>%s</small>',
  'btnAumenta': '<big>%s</big>', 
  'btnSu': '%s <sup>%s</sup>',
  'btnGiu': '%s <sub>%s</sub>', 
  'btnConverti': '<tt>%s</tt>',
  'btnRipristina': '%s'
}

In maniera similare sarà creato un secondo dizionario di nome stili che conterrà l’associazione nome del pulsante e marcatura Pango. Si possono notare gli elementi semplici come btnGrassetto col loro valore  semplice ‘<b>%s</b>‘ e altri elementi più complessi come btnSu e ‘%s <sup>%s</sup>‘ che utilizzerà due stringhe (rivedere l’esempio precedente per chiarire). L’ultimo elemento è btnRipristina che restituirà unicamente %s ovvero il testo semplice senza marcatori Pango.

def on_window1_destroy(widget, data=None):
  gtk.main_quit()

La funzione di chiusura dell’applicazione non sarà toccata affatto.

def cambiaAllineamento(widget, data=None):
  lblTesto.set_justify(allineamenti[gtk.glade.get_widget_name(widget)])

Ed ecco la prima delle funzioni: cambiaAllineamento che si occuperà di cambiare l’allineamento del testo dell’etichetta. Nell’esempio precedente svolgeva unicamente il richiamo del metodo set_justify con la costante di allineamento, quale gtk.GTK_JUSTIFY_CENTER.

La routine di callback riceve nel primo parametro widget il riferimento al controllo che ha scatenato il segnale, ovvero il pulsante stesso premuto. La funzione gtk.glade.get_widget_name restituirà il nome del controllo nel file Glade che gli viene passato come argomento.

Richiamando quindi gtk.glade.get_widget_name col parametro widget saremo in grado di ottenere il nome (in stringa) del widget che ha scatenato il segnale e quindi il pulsante che è stato premuto, ad esempio ‘btnAllineaCentro‘.

Il nome del pulsante è anche la chiave del dizionario allineamenti, per cui con semplicità potrà essere ricavata la costante gtk per l’allineamento, che sarà quindi passata al metodo set_justify che svolgerà l’operazione sull’etichetta.

def cambiaStile(widget, data=None):
  lblTesto.set_label(stili[gtk.glade.get_widget_name(widget)] % testo)

Anche la funzione cambiaStile svolgerà un’operazione del genere, recuperando il nome del pulsante premuto e ricercando questo nel dizionario stili, che restituirà la stringa di formattazione (ad esempio ‘<b>%s</b>‘) che verrà passata, decodificata con la variabile testo, al metodo set_label.

def cambiaStile2(widget, data=None):
  lblTesto.set_label(stili[gtk.glade.get_widget_name(widget)] % (testo, 'Altro testo'))

Infine la funzione cambiaStile2 svolge un’attività analoga alla precedente, con l’unica differenza che decodifica invece due stringhe, testo e la costante ‘Altro testo’ che verrà presentato come apice o pedice nell’etichetta.

segnali = {
  'on_window1_destroy': on_window1_destroy, 
  'cambiaAllineamento': cambiaAllineamento, 
  'cambiaStile': cambiaStile, 
  'cambiaStile2': cambiaStile2
}

gladeFile.signal_autoconnect(segnali)

if window1:
  window1.show()
  gtk.main()

L’esempio si conclude con le solite assegnazioni delle funzioni di callback ai segnali e l’avvio del programma.

Le funzionalità del programma sono esattamente le stesse dell’esempio precedente ma questo è molto più compatto, utilizza solo 4 funzioni di callback invece che 15 come in precedenza. Le due caratteristiche principali di questo esempio sono:

  1. L’uso di una funzione di callback comune a più segnali
  2. La funzione gtk.glade.get_widget_name che dal riferimento di un widget risale al nome dello stesso nel file Glade

Queste tecniche consentono di ridurre la complessità del progetto, diminuendo il numero di funzioni coinvolte. E’ possibile scaricare sia il progetto Glade che il sorgente Python.

0 Responses to “Ottimizzazione dell’interfaccia d’uso della GtkLabel”



  1. Lascia un commento

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...




Indice degli argomenti


%d blogger cliccano Mi Piace per questo: