Programmer des interfaces graphiques avec GTK

ArticleCategory:

SoftwareDevelopment

AuthorImage:

Ozcan Gungor

TranslationInfo:

original in tr �zcan G�ng�r

tr to en �zcan G�ng�r

en to fr Frederic Nourry

AboutTheAuthor

J'utilise Linux depuis 1997. Libert�, flexibilit� et opensource. Ce sont les propri�t�s que je pr�f�re.

Abstract

Dans cette s�rie d'articles, nous allons voir comment �crire des programmes avec interfaces graphiques utilisateur (GUI) gr�ce � GTK. Je n'ai aucune id�e du nombre d'articles qu'il faudra. Pour bien comprendre ces articles, vous devez poss�der les notions suivantes de programmation en langage C:


ArticleIllustration:

GTK

ArticleBody:

Qu'est-ce que GTK?

GTK (GIMP Toolkit) est une biblioth�que pour cr�er des interfaces graphique utilisateur (Graphical User Interfaces ou GUI). Elle est disponible sous licence GPL. Gr�ce a cette biblioth�que, vous pouvez cr�er des programmes open-source, gratuits ou commerciaux.

La biblioth�que s'appelle GIMP toolkit (GTK) car elle a �t� cr��e � l'origine pour le developpement de GIMP (General Image Manipilation Program). Les auteurs de GTK sont:

GTK est une biblioth�que orient�e objet . Bien qu'�crite en C, elle utilise les notions de classes et de fontions callback.

Complilation

Afin de compiler des programmes GTK, vous devez dire au compilateur gcc ce que sont les biblioth�ques GTK et o� elles se trouvent. La commande gtk-config permet d'obtenir ces informations.

# gtk-config --cflags --libs

Elle doit vous donner en sortie quelque chose du genre (selon votre syst�me):

-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

Explication de ces param�tres:

-l library: Cherche une biblioth�que de la forme liblibrary.a dans les chemins d�finis.
-L path: Ajoute un chemin de recherche de biblioth�ques.
-I path: Ajoute un chemin de recherche de fichiers d'ent�te utilis�s par le programme.

Pour compiler un programme GTK nomm� 'hello.c', utilisez la commande suivante:

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

Le param�tre apr�s le '-o' est le nom du programme compil�.

Notre premier programme

Nous supposons que GTK est install� sur votre machine. La derni�re version de GTK peut �tre obtenue � ftp.gtk.org.

Ecrivons notre premier programme. Il va cr�er une simple fen�tre vide de 200x200 pixels.

#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);
}   

Le GtkWidget est un type de variable servant � d�clarer divers composants graphiques comme une fen�tre, un bouton, une �tiquette... Dans cet exemple, une fen�tre est d�clar�e par:

GtkWidget *window;

void gtk_init(int *argc,char ***argv) initialise le toolkit et r�cup�re les param�tres entr�s sur la ligne de commande. Cette fonction doit �tre utilis�e apr�s avoir d�clar� les composants graphiques.

GtkWidget *gtk_window_new(GtkWindowType windowtype) cr�e une nouvelle fen�tre. Le type de fen�tre peut �tre:

void gtk_widget_show(GtkWidget *widget) est utilis� pour faire appara�tre un composant graphique dans la fen�tre. Apres avoir d�fini un composant et modifi� ses attributs, cette fonction doit �tre utilis�e.

void gtk_main(void) pr�pare les fen�tres et tous les composants � appara�tre � l'�cran. Cette fonction doit �tre appel�e � la fin des programmes GTK.

Utilisons quelques propri�t�s de fen�tres comme le titre, la taille, la position...

void gtk_window_set_title(GtkWindow *window,const gchar *title) est utilis� pour d�finir ou changer le nom de window. Le premier param�tre de cette fonction se trouve dans le type GtkWindow, mais la variable window se trouve dans le type GtkWidget. Pendant la compilation, nous en serons avertis. M�me si le programme compil� fonctionne correctement, il est pr�f�rable de le modifier par GTK_WINDOW(GtkWidget *widget). Le second param�tre title est de type gchar, d�fini dans la biblioth�que glib et il est �quivalent au type char.

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height) d�finit les dimensions de window. Comme gchar, gint est d�fini dans glib, et il est �quivalent au type int.

La fonction

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position)

d�finit la position de window. La valeur de position peut �tre:

Voici un exemple:

#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);
}

Signaux et �v�nements

Avec les "GUI", vous devez utiliser la souris et le clavier, c'est-�-dire que vous pouvez cliquer sur un bouton. Pour ce faire, on utilise la fonction GTK suivante :

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

object est le composant graphique qui �met les signaux. Par exemple, vous voulez savoir si on a cliqu� sur un bouton, object sera ce bouton. name est le nom de l'�v�nement qui peut �tre :

func est le nom de la fonction qui sera appel�e lorsque l'�v�nement aura lieu. Voici un exemple:

#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 fonction

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

attend l'�v�nement "destroy" li� � la fen�tre. Lorsqu'on tente de fermer la fen�tre, la fonction close est appel�e. Elle appelle gtk_main_quit() et le programme s'arr�te.

Les d�tails sur les signaux et les �v�nement seront abord�s plus tard...

Un bouton simple

Les boutons normaux sont utilis�s en g�n�ral pour faire certaines choses quand on clique dessus. Avec la biblioth�que GTK, il y a deux fa�ons de cr�er des boutons :

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

La premi�re fonction cr�e un bouton sans �tiquette (pas de texte �crit sur le bouton). La deuxi�me cr�e un bouton avec une �tiquette (label est �crit sur le bouton).

Ici, nous allons utiliser une nouvelle fonction:

void gtk_container_add(GtkContainer *container,GtkWidget *widget)

Avec cette fonction, il est possible d'ajouter un bouton (ou un composant graphique) dans une fen�tre (habituellement dans un conteneur). Dans le prochain exemple, le conteneur est une fen�tre et le composant � ajouter est un bouton. Nous verrons d'autres conteneurs plus tard.

La chose la plus importante pour un bouton est de savoir si on clique dessus ou non. Une nouvelle fois, on utilise la fonction gtk_signal_connect dans ce but. Gr�ce � cette fonction, une autre fonction pourra �tre appel�e et ex�cutera le code associ� au bouton. Voici un exemple:

#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);
}