Non chiuderti, sesamo

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.

9 Responses to “Non chiuderti, sesamo”


  1. 1 Marco ottobre 23, 2008 alle 9:47 am

    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.

  2. 2 luposystem ottobre 23, 2008 alle 1:27 pm

    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

  3. 3 DarKprince ottobre 27, 2008 alle 1:33 pm

    ti prego non dirci ke ti sei fermato qui :°°°°°°(

  4. 4 Muflone ottobre 29, 2008 alle 6:38 pm

    no sono rientrato dopo una settimana di lavoro fuori sede, con l’influenza addosso, riprendero` prestissimo

  5. 5 andrea novembre 14, 2010 alle 10:38 am

    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.

  6. 6 Muflone novembre 14, 2010 alle 4:42 pm

    puo` influire si` il tema, dovrebbero pero` mostrarlo almeno disabilitato se non lo supporta assente.

    hai provato a passarci sopra col mouse?

  7. 7 andrea novembre 14, 2010 alle 5:12 pm

    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..

  8. 8 Muflone novembre 14, 2010 alle 5:45 pm

    disabilita compiz e riprova

  9. 9 andrea novembre 14, 2010 alle 6:03 pm

    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..


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: