Programmazione di GUI con GTK

ArticleCategory:

SoftwareDevelopment

AuthorImage:

Ozcan Gungor

TranslationInfo:

original in tr Özcan Güngör

tr to en Özcan Güngör

en to it Alessandro Pellizzari

AboutTheAuthor

Uso Linux dal 1997. Libert�, flessibilit� e opensource. Queste sono le caratteristiche che mi piacciono.

Abstract

In questa serie di articoli impareremo come scrivere interfacce grafiche (GUI) con GTK. Non ho idea di quanto durer�. Per capire questi articoli dovreste conoscere le seguenti caratteristiche del linguaggio C:


ArticleIllustration:

GTK

ArticleBody:

Cos'� GTK?

GTK (GIMP Toolkit) � una libreria per la creazione di Interfacce Utente Grafiche (GUI, Graphical User Interface). � disponibile sotto licenza GPL. Usando questa libreria potete creare programmi open-source, free o commerciali.

La libreria si chiama GIMP Toolkit (GTK) perch� originariamente � stata creata per sviluppare GIMP (General Image Manipulation Program). Gli autori di GTK sono:

GTK � un'interfaccia utente orientata agli oggetti. Anche se � scritta in C, usa le idee di classe e funzione di callback.

Compilazione

Per compilare programmi GTK, dovete dire a gcc cosa sono e dove si trovano le librerie GTK. Il programma gtk-config "conosce" queste cose.

# gtk-config --cflags --libs

L'output di questo comando � simile al seguente (dipende dal sistema):

-I/opt/gnome/include/gtk-1.2 -I/opt/gnome/include/glib-1.2 -I/opt/gnome/lib/glib /include -I/usr/X11R6/include -L/opt/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -l Xext -lX11 -lm

I parametri hanno il seguente significato:

-l libreria: Cerca una libreria con nome liblibreria.a nei path definiti.
-L path: Aggiunge un percorso dove cercare le librerie.
-I path: Aggiunge un percorso dove cercare i file header.

(NdT: il comando si riferisce alla versione fino alla 1.2 di Gtk+. Dalla versione 2.0 si usa pkg-config con una sintassi diversa)

Per compilare un programma GTK di nome hello.c, si pu� usare il seguente comando:

gcc -o hello hello.c `gtk-config --cflags --libs`

Quello che segue il parametro -o � il nome del programma compilato.

Un primo programma

Assumiamo che GTK sia installato nel vostro sistema. L'ultima versione di GTK pu� essere trovata a ftp.gtk.org.

Scriviamo il nostro primo programma. Questo programma crea una finestra 200x200, vuota.

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_show  (window);

    gtk_main ();

    return(0);
}

GtkWidget � un tipo variabile per definire diverse componenti come finestre, bottoni, etichette... In questo esempio viene definita una finestra nel modo seguente:

GtkWidget *window;

void gtk_init(int *argc, char ***argv) inizializza il toolkit, passandogli i parametri scritti nella linea di comando. Questa funzione deve essere usata dopo aver definito i componenti.

GtkWidget *gtk_window_new(GtkWindowType windowtype) crea una nuova finestra. Il tipo di finestra pu� essere:

void gtk_widget_show(GtkWidget *widget) viene usato per far apparire il componente nella finestra. Dopo aver definito un componente e averne cambiato gli attributi bisogna usare questa funzione.

void gtk_main(void) prepara le finestre e tutti i componenti per farli apparire sullo schermo. Questa funzione deve essere usata alla fine dei programmi GTK.

Usiamo un po' di propriet� della finestra, come titolo, dimensioni, posizione, ...

void gtk_window_set_title(GtkWindow *window, const gchar *title) viene usata per impostare o cambiare il titolo della window. Il primo parametro della funzione � di tipo GtkWindow. Ma window � di tipo GtkWidget. Durante la compilazione verremo avvisati di questo. Anche se il programma compilato funziona, � meglio correggerlo. GTK_WINDOW(GtkWidget *widget) viene usato per questo motivo. Il secondo parametro title � di tipo gchar. gchar viene definito nella libreria glib ed � la stessa cosa del tipo char.

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height) imposta la dimensione di window. Come gchar, gint viene definito in glib ed � la stessa cosa di int.

La funzione

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position)

imposta la posizione di window. position pu� essere:

Ecco un esempio:

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Ýlk Program");
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),300,300);
    gtk_widget_show  (window);

    gtk_main ();

    return(0);
}

Segnali ed Eventi

Nelle GUI si possono usare mouse e tastiera, per esempio si pu� clickare su un pulsante. Si deve quindi usare la seguente funzione GTK:

guint gtk_signal_connect_object(GtkObject *object, const gchar *name, GtkSignalFu nc func, GtkObject *slot_object);

object � il componente che emette il segnale. Per esempio, se volete sapere quando un pulsante viene clickato, object sar� il pulsante. name � il nome dell'evento e pu� essere:

func � il nome della funzione che verr� richiamata quando accadr� l'evento. Ecco un esempio:

#include <gtk/gtk.h>

void close( GtkWidget *widget,gpointer *data)
{
    gtk_main_quit();
}

int main( int   argc,char *argv[] )
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (close), NULL);
    gtk_widget_show  (window);

    gtk_main ();

    return(0);
}

La funzione

gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (close), NULL)

rimane in ascolto di ricevere l'evento di distruzione della finestra. Quando si tenta di chiudere la finestra viene chiamata la funzione close. La funzione close chiama gtk_main_quit() e il programma finisce.

Pi� avanti verranno spiegati i dettagli dei segnali e degli eventi.

Un normale bottone

I bottoni vengono generalmente usati per fare determinate azioni quando vengono clickati. In GTK ci sono due modi per creare i bottoni:

  1. GtkWidget* gtk_button_new (void);
  2. GtkWidget* gtk_button_new_with_label (const gchar *label);

La prima funzione crea un bottone senza etichetta (non c'� scritto niente dentro il bottone). La seconda crea un bottone con un'etichetta (label viene scritto nel bottone).

Qui useremo una nuova funzione:

void gtk_container_add(GtkContainer *container, GtkWidget *widget)

Usando questa funzione � possibile fare in modo che un bottone (o genericamente un qualsiasi componente) appaia in una finestra (o genericamente un qualsiasi contenitore). Nel prossimo esempio il contenitore � una finestra e il componente � un bottone. Pi� avanti impareremo di pi� sui contenitori.

La cosa pi� importante riguardo i bottoni � sapere se sono stati clickati o meno. Anche qui si usa la funzione gtk_signal_connect. Questa volta chiameremo un'altra funzione che verr� eseguita "dietro" il bottone. Ecco un esempio:

#include <gtk/gtk.h>

void close( GtkWidget *widget,gpointer *data)
{
    gtk_main_quit();
}

void clicked(GtkWidget *widget,gpointer *data)
{
        g_print("Button Clicked\n");
}

int main( int   argc,char *argv[] )
{
    GtkWidget *window,*button;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (close), NULL);

    button=gtk_button_new_with_label("Button");
    gtk_container_add(GTK_CONTAINER(window),button);
    gtk_signal_connect(GTK_OBJECT(button),"clicked",
                       GTK_SIGNAL_FUNC(clicked),NULL);
    gtk_widget_show(button);

    gtk_widget_show(window);

    gtk_main ();

    return(0);
}