
Passiamo allo sviluppo di una piccola applicazione che controlla le operazioni di chiusura della finestra. Banalmente si tratterà di una sola finestra con due pulsanti uno dei quali farà sparire e riapparire il pulsante di chiusura, utile per proibire temporaneamente la chiusura della finestra. L’altro pulsante consentirà la chiusura della finestra anche quando la normale chiusura è impedita.
Aperto Glade e inserita una nuova finestra di nome window1, impostiamo subito il titolo sulla barra con la proprietà Titolo della finestra come già visto altre volte. Inseriamo all’interno della finestra una Casella orizzontale di due elementi e dentro ciascuno d’essi un pulsante.
Il primo di nome btnCambia, con l’immagine Stock Rimuovi e il secondo di nome btnEsci con l’immagine Stock Esci. Assegnamo ai segnali clicked le funzioni predefinite on_btnCambia_clicked e on_btnEsci_clicked.
Prima di concludere sul progetto Glade, selezioniamo la finestra e dalla scheda Segnali apriamo il gruppo GtkWidget e sul segnale delete-event assegnamo la funzione on_window1_delete_event. Si tratta di un segnale che scatterà al momento del click sul pulsante con la X di chiusura della finestra e consentirà di gestire la condizione di chiusura ed eventualmente interromperla.
Salviamo adesso il progetto Glade col nome closebutton.glade e passiamo subito al codice Python che si occuperà del suo funzionamento.
import gtk
import gtk.glade
import pygtk
pygtk.require("2.0")
def on_btnEsci_clicked(widget, data=None):
window1.destroy()
def on_window1_destroy(widget, data=None):
gtk.main_quit()
Iniziamo con la parte più semplice, già vista in precedenza, che riguarda il pulsante btnEsci dedicato alla chiusura della finestra e l’azione che alla distruzione della finestra termina anche il ciclo principale delle GTK.
def on_window1_delete_event(widget, event, data=None): return True
Il segnale delete-event a differenza degli altri riceverà 3 argomenti, il primo sarà sempre il controllo cui si riferisce, il secondo sarà l’evento che farà scattare il segnale e l’ultimo gli eventuali dati aggiuntivi alla funzione di callback. Questo segnale si aspetta un valore di ritorno True o False, nel caso sia False (o non venga precisato) procede alla chiusura della finestra facendo scattare il segnale destroy. Nel caso il valore restituito sia True, sarà ignorata l’operazione di chiusura della finestra.
Ciò si rende utile per presentare all’utente finestre di conferma della chiusura e in caso di annullamento, non procedere con l’operazione di chiusura. Nel nostro esempio, abbiamo scelto di impedire sempre la chiusura della finestra tramite il pulsante X sulla barra del titolo, restituendo True, penserà l’altro pulsante alla chiusura della finestra.
def on_btnCambia_clicked(widget, data=None):
if window1.get_deletable():
btnCambia.set_label('gtk-add')
window1.set_deletable(False)
else:
btnCambia.set_label('gtk-remove')
window1.set_deletable(True)
Infine la funzione di gestione del pulsante btnCambia che svolgerà due funzioni: se il pulsante di chiusura della finestra è visibile cambierà l’icona del pulsante btnCambia mostrando l’icona Aggiungi (gtk-add) e quindi toglierà il pulsante di chiusura dalla finestra. Nel caso in cui il pulsante non sia visibile al momento del click farà l’inverso: mostrerà l’icona Rimuovi (gtk-remove) e mostrerà il pulsante di chiusura della finestra.
Il metodo get_deletable restituisce un valore che indica se il pulsante di chiusura della finestra è presente, mentre il suo analogo set_deletable consente di mostrare o nascondere lo stesso pulsante.
Ciò consentirà di rendere il pulsante a due fasi: se lo stato è attivo, disattiva, mentre se è disattivo, attiva il pulsante di chiusura.
segnali = {
'on_btnEsci_clicked': on_btnEsci_clicked,
'on_window1_destroy': on_window1_destroy,
'on_window1_delete_event': on_window1_delete_event,
'on_btnCambia_clicked': on_btnCambia_clicked
}
gladeFile = gtk.glade.XML('closebutton.glade')
window1 = gladeFile.get_widget('window1')
btnCambia = gladeFile.get_widget('btnCambia')
gladeFile.signal_autoconnect(segnali)
if window1:
window1.show()
gtk.main()
Il resto del codice è il caricamento del file Glade, l’assegnazione dei segnali al file Glade, la visualizzazione della finestra e l’avvio del programma GTK.

Inizialmente si presenterà così la finestra del programma, col primo pulsante che mostra l’icona Rimuovi e il pulsante di chiusura della finestra nell’angolo della finestra. Tuttavia cliccare su quest’ultimo non sortirà alcun effetto poiché come da noi deciso, il segnale delete-event restituirà il valore True che inibisce la chiusura.

Premendo il pulsante Rimuovi questi mostrerà l’icona Aggiungi e farà sparire il pulsante di chiusura della finestra. Premendo nuovamente il primo pulsante la situazione tornerà come quella iniziale, a ciò serviva il controllo if window1.get_deletable(). Se il metodo restituisce valore True allora il pulsante di chiusura è presente e al click verrà nascosto col metodo set_deletable, per cui sarà necessario mostrare l’icona Aggiungi.
In questo nuovo esempio le novità proposte sono il segnale delete-event che consente di gestire la chiusura prima che questa avvenga e i due metodi get_deletable e set_deletable che consentono di conoscere la condizione del pulsante di chiusura e di modificarla, attivandolo o disattivandolo.
E’ possibile scaricare il progetto Python e l’interfaccia Glade.
Finalmente trovo qualcuno che si occupa di glade e pygtk…in italiano
complimente…continuerò a seguirti.
Anche io ho deciso di sviluppare così..nel caso vedrò di mandarti qualche altro appunto se non ti dispiace.
Ciao Marco.
Ciao,
Ho letto un po il tuo lavoro riguardo Python e le librerie GTK, bè non c’è a che dire proprio un bel lavoro molto utile dato che come tu hai fatto notare la documentazione ufficiale e non è assai scarsa…
seguirò ogni tuo nuovo intervento in modo da colmare le mie idee al riguardo di questo argomento!
Grande!!
ciao
Lupo
ti prego non dirci ke ti sei fermato qui :°°°°°°(
no sono rientrato dopo una settimana di lavoro fuori sede, con l’influenza addosso, riprendero` prestissimo
grazie ancora per queste varie guide che trovo utilissime.
che tu sappia il tema scelto può influire sulla scomparsa o meno del bottone della chiusura di una finestra?
anche se scarico il tuo e lo mando in esecuzione il bottone aggiungi cambia solo la sua label in “rimuovi”, non fa scomparire il bottone di chiusura.
puo` influire si` il tema, dovrebbero pero` mostrarlo almeno disabilitato se non lo supporta assente.
hai provato a passarci sopra col mouse?
no, il tasto è attivo, anzi se ci clicco sopra si chiude (mettendo a commento la parte del return true e della funzione delete-event) sia se il tasto è impostato a aggiungi sia se è a rimuovi, ho provato anche con il tema Radiance (ubuntu 10.10) e nulla, si può chiudere.
ho notato un altro fatto strano, i tasti di tipo stock non visualizzano nessuna immagine accanto alla label..
disabilita compiz e riprova
Ecco!! Con compiz disattivato funziona, con compiz attivo invece non c’è alcun funzionamento di quella funzione, il resto funziona normalmente.
Probabilmente compiz non permette di disattivare la chiusura della finestra se non in altri modi..