Affichage dynamique -type animation
Bonjour,
Je commence - je crois - à bien comprendre GTK (même si je ne maitrise pas encore tout évidement). Plus trop de problème pour afficher et gérer des choses en statique.
Ce que je voudrais faire à présent, est d'avoir un affichage dynamique (par exemple du type chronomètre que affiche les secondes qui défilent, pour rester simple). J'ai beau chercher partout, je ne trouve pas. Notamment, pour l'application que je dois développer, je suis mal à l'aise avec l'idée d'utiliser des timeouts car il se passe potentiellement des choses tout le temps - en continu - et l'affichage doit suivre ceci de manière fluide. Si je prends comme exemple l'affichage des nombres entiers, 1, 2, 3 etc., je pensais naïvement definir une fonction callback qui met à jour un label, et qui est appelée chaque fois que le signal "expose-event" est capté, avec un code comme ca:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <stdlib.h>
#include <gtk/gtk.h>
int i=1;
int main(int argc, char **argv)
{
/* déclaration des widgets */
GtkWidget *pWindow; /*fenetre */
GtkWidget *pLabel; /* un label */
void OnDestroy(GtkWidget *pWidget, gpointer pData); /* fonction call back destroy */
void OnExpose(GtkWidget *pWidget, gpointer pData); /* fonction call back mise à jour affichage */
/* Initialisation de GTK+ */
gtk_init(&argc, &argv);
/* création de la fenetre */
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* définition des paramètres de la fenetre */
gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(pWindow), 500, 500);
gtk_window_set_title(GTK_WINDOW(pWindow), "fenetre");
/* création du label */
pLabel=gtk_label_new("1");
/* ajout du label à la fenetre */
gtk_container_add(GTK_CONTAINER(pWindow), pLabel);
/*affichage de la fenetre */
gtk_widget_show_all(pWindow);
/* Connexion des signaux */
g_signal_connect(G_OBJECT(pWindow), "expose-event", G_CALLBACK(OnExpose), GTK_LABEL(pLabel));
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
/* Demarrage de la boucle evenementielle */
gtk_main();
return EXIT_SUCCESS;
}
void OnDestroy(GtkWidget *pWidget, gpointer pData){
/* Arret de la boucle evenementielle */
gtk_main_quit();
}
void OnExpose(GtkWidget *pWidget, gpointer pData){
/* Mise a jour du label */
char tempo[10];
(void)sprintf(tempo, "%d", i);
i++;
gtk_label_set_text(GTK_LABEL(pData), tempo);
} |
Ca ne marche pas. Ai-je donc loupé quelque chose? Le signal "expose-event" n'est-il pas le bon signal à gérer? D'autres solutions existent?
D'avance merci pour toute aide sur ce point.
Eric.
Cycle de vie des widgets gtk
Il faudrait peut-être mettre la commande show en dernier, après la connexion des signaux.
Le signal expose-event est appellé dans show.
Un conseil : aller voir des exemples Gtk soit dans rosetta-code.org, soit dans un tutoriel.de ce site.