{"id":358,"date":"2019-11-02T01:28:23","date_gmt":"2019-11-02T00:28:23","guid":{"rendered":"http:\/\/www.forlex.it\/blog\/?p=358"},"modified":"2019-11-02T01:28:41","modified_gmt":"2019-11-02T00:28:41","slug":"interfacce-grafiche-per-i-nostri-programmi-in-gtk-parte-1","status":"publish","type":"post","link":"http:\/\/www.forlex.it\/index.php\/2019\/11\/02\/interfacce-grafiche-per-i-nostri-programmi-in-gtk-parte-1\/","title":{"rendered":"Interfacce grafiche per i nostri programmi in GTK+ &#8211; parte 1 &#8211;"},"content":{"rendered":"\n<p>Negli ultimi anni siamo stati testimoni di un notevole incremento della complessit\u00e0 ed allo stesso tempo bellezza delle interfacce grafiche dei software che usiamo come anche del Sistema Operativo che abbiamo installato sul nostro calcolatore. In questa guida, che per comodit\u00e0 divider\u00f2 in pi\u00f9 parti, ho pensato di proporvi un sistema per realizzare interfacce semplici ma allo stesso tempo potenti ed in alcuni casi ottime dal punto di vista della leggerezza in termini di costi di elaborazione. Il Gimp Tool Kit, noto come G.T.K., \u00e8 una libreria scritta in linguaggio C che emula una organizzazione Object Oriented,&nbsp;&nbsp; includendola nei nostri codici sorgente potremo costruire dei widget&nbsp; (oggetti) grafici che assemblati secondo semplici regole andranno a costituire l&#8217;interfaccia grafica ai nostri programmi.<\/p>\n\n\n\n<p>Prepariamo l&#8217;ambiente di sviluppo su Debian<\/p>\n\n\n\n<p>Prima di tutto scaricate dal sito www.gtk.org i seguenti pacchetti :<\/p>\n\n\n\n<p>glib-2.16.0.tar.gz<br>pango-1.20.0.tar.gz<br>gtk+-2.12.0.tar.gz<\/p>\n\n\n\n<p>Ora li scompattiamo e poi procediamo alla loro compilazione, in questo modo :<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># sudo .\/configure --prefix=\/usr<br># sudo make<br># sudo make install<\/pre>\n\n\n\n<p>solo per il pacchetto GTK+ l&#8217;installazione dovr\u00e0 essere fatta con il comando:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># sudo .\/configure --prefix=\/usr --without-libtiff --without-libjpeg<\/pre>\n\n\n\n<p>Nel caso doveste incontrare problemi durante l&#8217;installazione \u00e8 consigliabile aggiornare o semplicemente installare i seguenti pacchetti dai repository di Debian:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># sudo apt-get install build-essential libncurses5-dev <\/pre>\n\n\n\n<p>Oppure semplicemente installare dai repository ufficiali del vostro sistema Linux il seguente pacchetto (senza compilare il tutto come sopra):&nbsp;&nbsp; &nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># sudo apt-get install libgtk2.0-dev<\/pre>\n\n\n\n<p>A questo punto il nostro sistema \u00e8 pronto, o quasi, infatti ci mancano gli strumenti per poter scrivere i nostri programmi in sorgente (C o C++). La scelta ricade su un tool molto diffuso e potente : l&#8217;editor di testo :-), infatti basta uno qualsiasi di quelli gi\u00e0 conosciuti come : gedit, kwrite oppure vi o nano.<\/p>\n\n\n\n<p>Oltre all&#8217;editor di testo non occorrerebbe nulla, uso il condizionale perch\u00e8 per compilare il nostro programma in C avremo bisogno di un comando strutturato cos\u00ec come segue :<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#sudo gcc -Wall -g nome_file.c -o nome-file.c.run `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`<\/pre>\n\n\n\n<p>A questo punto \u00e8 chiaro che un altro \u201cstrumento di sviluppo\u201d sar\u00e0 uno script in bash pi\u00f9 che altro utile ad evitarci di dover ridigitare, ogni volta, comandi molto lunghi e fortemente affettibili da errore. Ecco come \u00e8 composto lo script, che vi consiglio di copiare ed incollare in un file che chiameremo : compila.sh <\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/sh<br>gcc -Wall -g $1 -o $1.run `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`<br>.\/$1.run<\/pre>\n\n\n\n<p>ricordiamoci di renderlo eseguibile per tutti:<\/p>\n\n\n\n<p>#sudo chmod ugo+x compila.sh<\/p>\n\n\n\n<p>seguendo questa procedura ed utilizzando lo script appena creato&nbsp; compileremo ed eseguiremo direttamente e con facilit\u00e0 ogni programma realizzato con le GTK+, ad esempio in questo modo :<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#.\/compila.sh&nbsp; &lt; nome_file.c &gt;<\/pre>\n\n\n\n<p>La nostra prima interfaccia GTK<\/p>\n\n\n\n<p>A questo punto tutto \u00e8 pronto per realizzare la nostra prima interfaccia. Per comodit\u00e0 commenter\u00f2 le righe di codice scritte direttamente all&#8217;interno del codice sorgente in modo che, in seguito, rileggendo i nostri programmi ricorderemo i passi eseguiti. In linguaggio C i commenti si possono scrivere in due modi : <br>preceduti da \/\/ se il commento \u00e8 su di una sola riga<br>preceduti da \/* e seguiti da *\/ se il commento si sviluppa su pi\u00f9 righe <\/p>\n\n\n\n<p>Come ho detto in precedenza, il nostro ambiente di sviluppo sar\u00e0 l&#8217;editor di testo quindi lanciamolo e scriviamo:<\/p>\n\n\n\n<p>\/* Includiamo la libreria che ci permette di usare e creare i nostri oggetti in GTK+ tra cui la finestra. *\/<br><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;gtk\/gtk.h&gt;<br>\/* Da questo punto in poi inizia il nostro programma. *\/<br>int main (int argc, char *argv[])<br>{<br>\/* Inizializzo i miei oggetti, creando un oggetto di tipo Widget e lo chiameremo window. *\/<br>GtkWidget *window;<br>\/* Inizializziamo GTK+ e tutte le librerie da lui supportate. *\/<br>gtk_init (&amp;argc, &amp;argv);<br>\/* Creiamo la finestra con i tasti di chiusura, minimizza e massimizza se volevamo il solo frame dovevamo utilizzare la voce GTK_WINDOW_POPUP. *\/<br>window = gtk_window_new (GTK_WINDOW_TOPLEVEL);<br>\/* Diamo un titolo alla nostra finestra. *\/<br>gtk_window_set_title (GTK_WINDOW (window), \"WINDOW\");<br>\/* Le diamo una dimensione (in pixel) fissa se si mette -1 e -1 la finestra assumer\u00e0 le dimensioni a seconda degli oggetti in essa creati. *\/<br>gtk_widget_set_size_request (window, 200, 100);<br>\/* Non diciamo altro che visualizzarla. *\/<br>gtk_widget_show_all (window);<br>\/* Controllo delle GTK+ nel loop del nostro programma. *\/<br>gtk_main ();<br>return 0;<br>}<\/pre>\n\n\n\n<p>Salviamo il tutto in un file denominato finestra.c e procediamo alla compilazione e all&#8217;esecuzione della nostra finestra:<\/p>\n\n\n\n<p>#.\/compila.sh finestra.c<\/p>\n\n\n\n<p>Ed ecco la nostra finestra in GTK+ &#8211; figura 1 -, per chiuderla baster\u00e0 cliccare sulla X ma, come vedremo, a terminale il processo non viene terminato saremo dunque costretti a chiuderlo con la combinazione di tasti CTRL+C.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"images\/gtk\/gtk_1parte-figura1.png\" alt=\"Image\"\/><\/figure>\n\n\n\n<p>Ecco cos\u00ec la nostra prima finestra in GTK+!!!<\/p>\n\n\n\n<p>Chiudere un processo dall&#8217;interfaccia<\/p>\n\n\n\n<p>Abbiamo appena scoperto che per terminare il processo che ha generato l&#8217;interfaccia, siamo stati costretti a digitare Ctrl + c. In realt\u00e0 possiamo ovviare a questo inserendo all&#8217;interno del nostro codice una parte che gestir\u00e0 questo tipo di evento; Al momento della chiusura della finestra dovremo inviare un segnale che interromper\u00e0 il processo ad essa associata.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;gtk\/gtk.h&gt;<br><br>\/* Funzione che gestisce il segnale di destroy la X. *\/<br>static void destroy (GtkWidget*, gpointer);<br>\/* Funzione che ci permetter\u00e0 di gestire l'eventuale conferma di chiusura della finestra. *\/<br>static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer);<br><br>int main (int argc, char *argv[])<br>{<br>GtkWidget *window;<br>gtk_init (&amp;argc, &amp;argv);<br>window = gtk_window_new (GTK_WINDOW_TOPLEVEL);<br>gtk_window_set_title (GTK_WINDOW (window), \"WINDOW\");<br>gtk_container_set_border_width (GTK_CONTAINER (window), 10);<br>gtk_widget_set_size_request (window, 200, 100);<br>\/* Connettiamo la nostra finestra al segnale di destroy e di delete_event dove il nostro oggetto \u00e8 la nostra finestra il segnale che \u00e8 in ascolto \u00e8 il destroy e qualora dovesse arrivare verr\u00e0 eseguita la funzione associata alla callback. *\/<br>g_signal_connect (G_OBJECT (window), \"destroy\", G_CALLBACK (destroy), NULL);<br>g_signal_connect (G_OBJECT (window), \"delete_event\", G_CALLBACK (delete_event), NULL);<br>gtk_widget_show_all (window);<br>gtk_main ();<br>return 0;<br>}<br><br>\/* Stoppiamo il loop del nostro programma fermando il tutto. *\/<br>static void destroy (GtkWidget *window, gpointer data)<br>{<br>gtk_main_quit ();<br>}<br><br>\/* Se restituisce FALSE distruggiamo la finestra, mentre se restituiamo TRUE possiamo fare in modo da annulare la chiusura della nostra finestra. *\/<br>static gboolean delete_event (GtkWidget *window, GdkEvent *event, gpointer data)<br>{<br>return FALSE;<br>}<\/pre>\n\n\n\n<p>In questa maniera oltre alla chiusura della finestra sar\u00e0 chiuso il processo ad essa associato liberando la memoria.<\/p>\n\n\n\n<p>Da ora in poi, questa sar\u00e0 sempre la base di partenza di tutte le nostre nuove applicazioni!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Negli ultimi anni siamo stati testimoni di un notevole incremento della complessit\u00e0 ed allo stesso tempo bellezza delle interfacce grafiche dei software che usiamo come anche del Sistema Operativo che abbiamo installato sul nostro calcolatore. In questa guida, che per &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/www.forlex.it\/index.php\/2019\/11\/02\/interfacce-grafiche-per-i-nostri-programmi-in-gtk-parte-1\/\"> <span class=\"screen-reader-text\">Interfacce grafiche per i nostri programmi in GTK+ &#8211; parte 1 &#8211;<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/358"}],"collection":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/comments?post=358"}],"version-history":[{"count":1,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/358\/revisions"}],"predecessor-version":[{"id":359,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/358\/revisions\/359"}],"wp:attachment":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/media?parent=358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/categories?post=358"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/tags?post=358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}