Initiation à l'environnement Linux

Atelier Informatique de l'Association Escale - 31 140 Pechbonnieu

Interaction entre une zone de saisie un label et un bouton

Description : on rentre du texte dans la zone de saisie et lorsque l'on clique sur le bouton, le texte saisie s'affiche dans un label. Cet exemple montre l'interaction entre trois objets différents (la boite d'édition, le label et le bouton).
Pour passer plusieurs objets comme arguments dans une fonction de rappel, on crée une structure contenant ces objets (structure data). C'est cette structure qui sera passé en argument.

Aperçu :

L'utilisateur tape du texte dans la zone de saisie

Après avoir cliqué sur le bouton "Ajouter"

Commande de compilation : si on a appelé le fichier 'programme.c', on compile le tout en tapant la commande :

gcc programme.c -o programme `pkg-config --cflags --libs gtk+-2.0`

(le signe " ` " s'obtient avec la combinaison des touches AltGr+7).

On exécute avec ./programme.c


Code source :

#include <gtk/gtk.h>

/* On cree une structure contenant le label et la boite d'edition.
 Ceci est necessaire pour pouvoir passer plusieurs objet en argument,
 lors de l'utilistation de la fonction g_signal_connect().
 */
typedef struct{
                GtkWidget *label;
                GtkWidget *edit;
        }Data;


/* Fonction ajoutant le texte dans le label */
void ajouter_texte( GtkWidget *boutonAjouter, Data *data )
{
        const gchar *texte;
        /* On prend le texte de la boite d'edition */
        texte = gtk_entry_get_text ( GTK_ENTRY(data->edit) );
        /* On affiche le texte dans le label */
        gtk_label_set_text ( GTK_LABEL(data->label), texte );
}

/* PROGRAMME PRINCIPAL */
int main( int   argc, char *argv[] )
{
        /* On cree les objets du type GtkWidget */
        Data data;
        GtkWidget *fenetre;
        GtkWidget *boite;
        GtkWidget *boutonAjouter;
    
        /* Initialisation de la bibliotheque */
        gtk_init (&argc, &argv);
    
        /* On cree une fenetre, le label, la boite d'edition et le bouton */
        fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        boite = gtk_vbox_new(FALSE, 5);
        data.label = gtk_label_new(NULL);
        data.edit = gtk_entry_new();
        boutonAjouter = gtk_button_new_with_label("Ajouter");

        /* Attachement des objets a la fenetre principale et a la boite */
        gtk_container_add (GTK_CONTAINER (fenetre), boite);
        gtk_box_pack_start( GTK_BOX(boite), data.label, TRUE, TRUE, 0);
        gtk_box_pack_start( GTK_BOX(boite), data.edit, FALSE, FALSE, 0);
        gtk_box_pack_start( GTK_BOX(boite), boutonAjouter, FALSE, FALSE, 0);

        /******* CONNEXION DES SIGNAUX *******/
        /* Termine l'application lorsque l'on ferme la fenetre */    
        g_signal_connect (G_OBJECT (fenetre), "destroy",
                        G_CALLBACK (gtk_main_quit), NULL);
        /* Connexion du singnal du bouton Ajouter Texte */
        g_signal_connect (G_OBJECT (boutonAjouter), "clicked",
                        G_CALLBACK (ajouter_texte), (gpointer) &data );

        /* Affiche la fenetre */
        gtk_widget_show_all  (fenetre);

        /* Boucle principal */    
        gtk_main ();
}