IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

afficher et changer d'image


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut afficher et changer d'image
    Bonjour

    Je cherche depuis quelques jours a afficher et changer une image en appuyant sur un bouton ou bien en passant par une variable.
    L'image que je désire afficher me semble assez simple genre une led ou bien un carré au format standard (png) et faisant moins de 1ko.
    En utilisant la fonction led = gtk_image_new_from_file ("./led_off.png"); cela fonctionne évidement. Mais je voudrais (par exemple ) mettre en mémoire led_on.png ou led off.png, puis afficher une des 2 images mémorisée.

    Je n'arrive pas a trouver les fonction ou les bibliothèque que je dois utiliser : gtkImage, ou bien gdkpixbuff ?
    Bien entendu j'ai lu votre tutoriel http://gtk.developpez.com/cours/gtk2/?page=page_11 et j'ai même essayé le widget que vous avez eu la sympathie de mettre a notre disposition ici http://franckh.developpez.com/tutori...eation-widget/

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    La solution réside dans les GdkPixbuf.

    Il suffit de charger les deux images dans des GdkPixbuf. Ces pointeurs devront persister en mémoire tout le temps nécessaire à l'utilisation du bouton.

    Ensuite il suffit de créer à volonté les GtkImage à partir de ces GdkPixbuf grâce à la fonction gtk_new_from_pixbuf();.

    Ainsi cela évite de charger à partir du disque les images à chaque appui sur le bouton et aussi de permettre d'écraser l'ancien GtkImage inséré dans le bouton par le nouveau sans se soucier de sa perte à ce moment là.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Tout d'abord, charge tes images dans des GdkPixbuf, avec gdk_pixbuf_new_from_file.

    Pour créer une GtkImage à partir d'un GtkPixbuf, on utilise gtk_image_new_from_pixbuf. Pour ensuite modifier l'image, il faut utiliser gtk_image_set_from_pixbuf. Cela évite d'avoir à détruire/reconstruire des GtkImage. Tu utilises la même, tu en changes juste le contenu.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    Bonjour et merci a vous gerald3d et liberforce, je vais faire des essais a partir de vos réponses. Je vous tiens au courant.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    rere

    malgrès de multiples essai avec vos conseil je n'y arrive pas, vous pourrez essayer ce code qui n'est pas à 100% de ma part que j'ai écris avec codeblock 13.12
    A la ligne 68 je fais le test if (label <= 2) et si vous inversez le < par un > on obtient un changement de l'image après recompil et relancement du programme.

    Enfin suite au précédent post sur les gtkentry ben il semble y avoir une solution dans ce code (en tout cas ça fonctione sur mon linux)

    Voici le code :


    #include <gtk/gtk.h>
    #include <stdlib.h>

    gint label=0 ;

    typedef struct _Data StructDat;
    struct _Data
    {
    GtkLabel * LabelVar ;
    GtkWidget * lblEntry ;
    GdkPixbuf * led ;
    GdkPixbuf * ledON;
    GdkPixbuf * ledOFF;
    gchar * stringLBL ;
    };

    static void cb_unit (GtkButton *Button3, StructDat *data) {

    if (label > 255) { label =0;
    return; }

    else label = label + 1;

    data->stringLBL = g_strdup_printf( "%03d", label );
    gtk_label_set_label( data->LabelVar, data->stringLBL );
    gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    g_free( data->stringLBL );
    }


    static void cb_diz (GtkButton *Button2, StructDat *data) {
    if (label > 255) { label =0;
    return; }

    else label = label + 10;

    data->stringLBL = g_strdup_printf( "%03d", label );
    gtk_label_set_label( data->LabelVar, data->stringLBL );
    gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    g_free( data->stringLBL );
    }


    int main(int argc, char **argv)
    {
    gtk_init(&argc, &argv);

    GtkWidget *window, *table, *bunit, *bdiz, *etiquet, * ledAFF;

    StructDat *data;
    data = g_slice_new( StructDat);

    data->ledOFF = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
    data->ledON = gdk_pixbuf_new_from_file ("./led_on.png", NULL);

    /* if (label <= 2) { data->led = data->ledON ; }
    else data->led = data->ledOFF ; */

    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_widget_set_size_request (window, 450, 250);
    gtk_window_set_title (GTK_WINDOW (window), " EssaiVariable");
    g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );

    table = gtk_table_new( 7, 7, FALSE ); // la table de base colones et puis lignes
    gtk_container_add( GTK_CONTAINER ( window ), table );


    if (label <= 2)
    {ledAFF = gtk_image_new_from_pixbuf(data->ledON) ,
    gtk_table_attach( GTK_TABLE( table ), ledAFF, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 ); }

    else ledAFF = gtk_image_new_from_pixbuf(data->ledOFF) ,
    gtk_table_attach( GTK_TABLE( table ), ledAFF, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    etiquet = gtk_label_new("variable");
    gtk_table_attach( GTK_TABLE( table ), etiquet, 4, 5, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0 );
    data->LabelVar = GTK_LABEL( etiquet );

    data->lblEntry = gtk_entry_new(); //_with_max_length(15);
    gtk_table_attach( GTK_TABLE( table ), data->lblEntry, 1, 4, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    bdiz = gtk_button_new_with_label( "Diz" );
    g_signal_connect( G_OBJECT( bdiz ), "clicked", G_CALLBACK ( cb_diz ), data);
    gtk_table_attach( GTK_TABLE( table ), bdiz, 3, 4, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    bunit = gtk_button_new_with_label( "Unit" );
    g_signal_connect( G_OBJECT( bunit ), "clicked", G_CALLBACK ( cb_unit ), data);
    gtk_table_attach( GTK_TABLE( table ), bunit, 4, 5, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    gtk_widget_show_all( window );
    gtk_main();
    g_slice_free( StructDat, data );

    return EXIT_SUCCESS ;
    }

    En espérant qu'il y ai le moins d'erreur possible.

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Pour plus de lisibilité pense à entourer ton code source des balises . Il suffit pour cela de sélectionner tout ton code source et de cliquer ensuite sur l'icône "#".

    Ceci dit, sans avoir essayer d'exécuter ton code, il faut changer l'image dans la fonction void cb_diz (GtkButton *Button2, StructDat *data);.

    Tu récupères dans cette fonction le pointeur data. Il te suffit simplement d'utiliser la fonction gtk_image_set_from_pixbuf(); comme te l'a indiqué LiberForce pour voir ta led changer .

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    Merci de votre réponse, mais je me permet 2 questions car je n'arette pas de faire des essais et des points fondamentaux m'échappent.

    Dans le progr, il y a la structure structdat que j'ai repris sur un exemple du net , pouvez vous me confirmer que c'est le canal de communication entres la boucle infinie main() et les routines (callback) appelante ? ou d'autres que reçoivent des info pour l'affichage ?

    Sur des exemples de programmes sur le net pourquoi on voit souvent du code écrit avec des fonctions avec (gpointer * data) au lieu d'une structure ? Après des recherches j'ai lu su un forum que (gpointer * data) ne permet que de communiquer avec un élément ??? Bref j'arrive pas a trouver de la doc en français.

    Sinon j'avais fait des essais en changeant les images via les callback "cb_diz (GtkButton *Button2, StructDat *data);" et cb_unit mais rien n'y faisait, sur l'exemple que je vous ai transféré j'avais pris la solution disons la plus draconienne, la plus directe.
    Peut être que le problème serait dans le main avec la boucle qui permet d'afficher ou rafraîchir l'écran. Mais pour l'instant je en pense pas être au top en GTK

    Merci d'avance

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par fgh39 Voir le message
    Merci de votre réponse, mais je me permet 2 questions car je n'arette pas de faire des essais et des points fondamentaux m'échappent.

    Dans le progr, il y a la structure structdat que j'ai repris sur un exemple du net , pouvez vous me confirmer que c'est le canal de communication entres la boucle infinie main() et les routines (callback) appelante ? ou d'autres que reçoivent des info pour l'affichage ?
    La plupart des prototypes des callbacks dans Gtk+ te permettent de transmettre une donnée personnelle via ce gpointer. De là à l'appeler canal de communication...je ne saurais dire.

    Citation Envoyé par fgh39 Voir le message
    ...
    Sur des exemples de programmes sur le net pourquoi on voit souvent du code écrit avec des fonctions avec (gpointer * data) au lieu d'une structure ? Après des recherches j'ai lu su un forum que (gpointer * data) ne permet que de communiquer avec un élément ??? Bref j'arrive pas a trouver de la doc en français.
    gpointer *data est équivalent à void *data. En d'autres termes on permet d'envoyer un pointeur générique, non typé. C'est la force (et certaines prises de tête ) du C. Ainsi il est possible de passer n'importe quel pointeur à une fonction qui pointe sur n'importe quel type d'objet.
    Ceci étant dit, ca infirme ce que tu as pu lire sur certains forums. Le fait de passer un pointeur tu passes une adresse qui peut pointer sur un objet représenté par une structure. Ce qui est d'ailleurs le cas dans ton code exemple. Tu accèdes donc via cette structure à plusieurs données.
    Le C te permet par ailleurs soit de conserver l'écriture void *data (ou gpointer *data), soit de type directement ce que tu transmets. Ici tu pourrais écrire StructDat *data en lieu et place.

    Montre-nous le code que tu as écris où tu changes les images dans les callbacks. On pourrait t'indiquer tes erreurs, s'il y en a...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    No PB pour le code c pas top secret et je tiendrais compte de l'indication de Gerald3D [les balises], sinon je vais re re jeter un œil sur les pointeurs. Sans vouloir écrire mon CV J'écrivais des progrs de très bas niveau et pour la nième fois je redécouvre le C [rien de + générique]. Difficile d'écrire une ihm compatible et multiplateforme en ASM, n'est ce pas ... ?

    Suite à 22h10 : Les pointeurs me rappellent l'adressage indexé.

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Il y a un début à tout. On est là pour t'aider .

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    Bonjour
    Comme vous me l'indiquez j'essaye d'utiliser la fonction "gtk_image_set_from_pixbuf();" mai je n'y arrive pas, l'ihm ne démarre pas et sur la console j'obtiens "Segmentation fault (core dumped)"

    J'ai réussi a trouver des exemples http://http://stackoverflow.com/ques...on-mouse-click c'est presque 1 démineur, ainsi que http://https://mail.gnome.org/archiv.../msg00203.htmln Hélas ce code semble avoir un pb.

    J'avais essayé avec "gtk_image_new_from_pixbuf()" les leds ne s'affichent pas mais le reste du progr fonctionne.
    Aussi je pensais que le mot ou terme 'new' comme gdk_pixbuf_new_from_file ou bien gtk_image_new_from_file() était un terme clef pour l'affichage ?
    Bref je cherche la fonction GTK ou bien GDK qui permette d'afficher une image a l'écran a partir d'une portion de mémoire contenant cette image.

    Par contre pour mettre une image dans un pixbuf le code semble bien être : " data->led = gdk_pixbuf_new_from_file ("./led_off.png", NULL); "
    Aussi si ça vous semble correct , je voudrais que les images s'enregistrent en temps voulu en mémoire, par exemple juste après le main() et ses déclarations et init des variables, et qu'une fois les images enregistrées/initialisées , si possible pas de rechargement (accès disque) inutile.

    Enfin j'ai bien relu un cour sur les pointeurs et ça me rappelle la notion d'adressage indexé.




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #include <gtk/gtk.h>
    #include <stdlib.h>
     
    gint label=0 ;
     
    typedef struct _Data StructDat;
    struct _Data
    {
    GtkLabel * LabelVar ;
    GtkWidget * lblEntry ;
    GdkPixbuf * led ;
    GdkPixbuf * ledON;
    GdkPixbuf * ledOFF;
    gchar * stringLBL ;
    };
     
    static void cb_unit (GtkButton *Button3, StructDat *data) {
     
    data->led = gdk_pixbuf_new_from_file ("./led_on.png", NULL);
     
    if (label > 255) { label =0;
    return; }
     
    else label = label + 1;
     
    data->stringLBL = g_strdup_printf( "%03d", label );
    gtk_label_set_label( data->LabelVar, data->stringLBL );
    gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    g_free( data->stringLBL );
    }
     
     
    static void cb_diz (GtkButton *Button2, StructDat *data) {
     
    data->led = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
     
    if (label > 255) { label =0;
    return; }
     
    else label = label + 10;
     
    data->stringLBL = g_strdup_printf( "%03d", label );
    gtk_label_set_label( data->LabelVar, data->stringLBL );
    gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    g_free( data->stringLBL );
    }
     
     
    int main(int argc, char **argv)
    {
    gtk_init(&argc, &argv);
     
    GtkWidget *window, *table, *bunit, *bdiz, *etiquet, * ledAFF;
     
    StructDat *data;
    data = g_slice_new( StructDat);
     
    data->ledOFF = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
    data->ledON = gdk_pixbuf_new_from_file ("./led_on.png", NULL);
     
    /* if (label <= 2) { data->led = data->ledON ; }
    else data->led = data->ledOFF ; */
     
    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_widget_set_size_request (window, 450, 250);
    gtk_window_set_title (GTK_WINDOW (window), " EssaiVariable");
    g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
     
    table = gtk_table_new( 7, 7, FALSE ); // la table de base colones et puis lignes
    gtk_container_add( GTK_CONTAINER ( window ), table );
     
    // gtk_image_set_from_pixbuf(GTK_IMAGE(ledAFF), data->led);
    //ledAFF = gtk_image_new_from_pixbuf(data->led);
    gtk_table_attach( GTK_TABLE( table ), ledAFF, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
     
    etiquet = gtk_label_new("variable");
    gtk_table_attach( GTK_TABLE( table ), etiquet, 4, 5, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0 );
    data->LabelVar = GTK_LABEL( etiquet );
     
    data->lblEntry = gtk_entry_new(); //_with_max_length(15);
    gtk_table_attach( GTK_TABLE( table ), data->lblEntry, 1, 4, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
    bdiz = gtk_button_new_with_label( "Diz" );
    g_signal_connect( G_OBJECT( bdiz ), "clicked", G_CALLBACK ( cb_diz ), data);
    gtk_table_attach( GTK_TABLE( table ), bdiz, 3, 4, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
    bunit = gtk_button_new_with_label( "Unit" );
    g_signal_connect( G_OBJECT( bunit ), "clicked", G_CALLBACK ( cb_unit ), data);
    gtk_table_attach( GTK_TABLE( table ), bunit, 4, 5, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
    gtk_widget_show_all( window );
    gtk_main();
    g_slice_free( StructDat, data );
     
    return EXIT_SUCCESS ;
    }

  12. #12
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour, j'ai regardé vite fait, commence déjà par décommenter la ligne 74, car là tu manipules un pointeur non initialisé.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    J'avais commenté la ligne 74 pour que le progr démarre

    Je cherche à mettre dans 2 plages de mémoire 2 images (toutes petites)
    Sélectionner une des 2 plages de mémoire
    Et afficher une des 2 images mémorisée comme une image.

    Je pense que les réponses se trouvent dans les lib GtkImage et/ou GdkPixbuf.

    Vous pourriez pas m'indiquer les fonctions ? JE comprend pas

  14. #14
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Alors, quelques remarques en vrac:

    Compile toujours avec l'option -Wall. Tu aurais ainsi vu que GtkTable est obsolète. Utilise GtkGrid à la place: https://developer.gnome.org/gtk3/stable/GtkGrid.html . Je vais continuer avec ton GtkTable, mais juste pour l'exemple.
    Si tu es sous Linux, installe devhelp, ça simplifie la recherche dans la doc.
    Ensuite, apprends à utiliser des outils de débogage. Utilise ce que tu veux, que ce soit un débogueur comme nemiver ou directemet gdb, ou en mettant des printf. Là en l'occurrence, gdb me dit que le crash a eu lieu ligne 74.
    Et effectivement, on voir que tu utilises data->led, alors que ce champ de la structure n'a pas encore été initialisé. Si tu remplaces led par ledON ou ledOFF que tu as initialisé juste au dessus, tu auras quelque chose qui s'affiche.

    Ensuite, ta manière d'essayer de changer l'image affichée dans les callbacks est mauvaise. Tu n'as pas besoin de recréer de GdkPixbuf, tu as déjà chargé ces 2 images, et tu as gardé des pointeurs vers elles, ledON et ledOFF. Un GtkImage c'est juste une boîte qui affiche le pixbuf que tu mets dedans. Ce que tu dois faire c'est appeler donc dire à la GtkImage quel pixbuf afficher. Et tu fais ça avec gtk_image_set_from_pixbuf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    #include <gtk/gtk.h>
    #include <stdlib.h>
     
    gint label=0 ;
     
    typedef struct _Data StructDat;
    struct _Data
    {
    	GtkLabel * LabelVar ;
    	GtkWidget * lblEntry ;
    	GtkWidget * image;
    	GdkPixbuf * led ;
    	GdkPixbuf * ledON;
    	GdkPixbuf * ledOFF;
    	gchar * stringLBL ;
    };
     
    static void cb_unit (GtkButton *Button3, StructDat *data) {
     
    	gtk_image_set_from_pixbuf(GTK_IMAGE(data->image), data->ledON);
     
    	if (label > 255) { label =0;
    		return; }
     
    	else label = label + 1;
     
    	data->stringLBL = g_strdup_printf( "%03d", label );
    	gtk_label_set_label( data->LabelVar, data->stringLBL );
    	gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    	g_free( data->stringLBL );
    }
     
     
    static void cb_diz (GtkButton *Button2, StructDat *data) {
     
    	gtk_image_set_from_pixbuf(GTK_IMAGE(data->image), data->ledOFF);
     
    	if (label > 255) { label =0;
    		return; }
     
    	else label = label + 10;
     
    	data->stringLBL = g_strdup_printf( "%03d", label );
    	gtk_label_set_label( data->LabelVar, data->stringLBL );
    	gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    	g_free( data->stringLBL );
    }
     
     
    int main(int argc, char **argv)
    {
    	gtk_init(&argc, &argv);
     
    	GtkWidget *window, *table, *bunit, *bdiz, *etiquet;
     
    	StructDat *data;
    	data = g_slice_new( StructDat);
     
    	data->ledOFF = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
    	data->ledON = gdk_pixbuf_new_from_file ("./led_on.png", NULL);
    	data->led = data->ledON;
     
    	/* if (label <= 2) { data->led = data->ledON ; }
    	   else data->led = data->ledOFF ; */
     
    	window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    	gtk_widget_set_size_request (window, 450, 250);
    	gtk_window_set_title (GTK_WINDOW (window), " EssaiVariable");
    	g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
     
    	table = gtk_table_new( 7, 7, FALSE ); // la table de base colones et puis lignes
    	gtk_container_add( GTK_CONTAINER ( window ), table );
     
    	// gtk_image_set_from_pixbuf(GTK_IMAGE(ledAFF), data->led);
    	data->image = gtk_image_new_from_pixbuf(data->led);
    	gtk_table_attach( GTK_TABLE( table ), data->image, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
     
    	etiquet = gtk_label_new("variable");
    	gtk_table_attach( GTK_TABLE( table ), etiquet, 4, 5, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0 );
    	data->LabelVar = GTK_LABEL( etiquet );
     
    	data->lblEntry = gtk_entry_new(); //_with_max_length(15);
    	gtk_table_attach( GTK_TABLE( table ), data->lblEntry, 1, 4, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
    	bdiz = gtk_button_new_with_label( "Diz" );
    	g_signal_connect( G_OBJECT( bdiz ), "clicked", G_CALLBACK ( cb_diz ), data);
    	gtk_table_attach( GTK_TABLE( table ), bdiz, 3, 4, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
    	bunit = gtk_button_new_with_label( "Unit" );
    	g_signal_connect( G_OBJECT( bunit ), "clicked", G_CALLBACK ( cb_unit ), data);
    	gtk_table_attach( GTK_TABLE( table ), bunit, 4, 5, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );
     
    	gtk_widget_show_all( window );
    	gtk_main();
    	g_slice_free( StructDat, data );
     
    	return EXIT_SUCCESS ;
    }
    J'ai essayé de faire le moins de modifications possibles pour que tu comprennes ce que j'ai fait. Voilà un patch correspondant aux modifications intéressantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    diff --git a/main.c b/main.c
    index 7906f3e..b68f546 100644
    --- a/main.c
    +++ b/main.c
    @@ -9,6 +9,7 @@ struct _Data
     {
     	GtkLabel * LabelVar ;
     	GtkWidget * lblEntry ;
    +	GtkWidget * image;
     	GdkPixbuf * led ;
     	GdkPixbuf * ledON;
     	GdkPixbuf * ledOFF;
    @@ -17,7 +18,7 @@ struct _Data
     
     static void cb_unit (GtkButton *Button3, StructDat *data) {
     
    -	data->led = gdk_pixbuf_new_from_file ("./led_on.png", NULL);
    +	gtk_image_set_from_pixbuf(GTK_IMAGE(data->image), data->ledON);
     
     	if (label > 255) { label =0;
     		return; }
    @@ -33,7 +34,7 @@ static void cb_unit (GtkButton *Button3, StructDat *data) {
     
     static void cb_diz (GtkButton *Button2, StructDat *data) {
     
    -	data->led = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
    +	gtk_image_set_from_pixbuf(GTK_IMAGE(data->image), data->ledOFF);
     
     	if (label > 255) { label =0;
     		return; }
    @@ -51,13 +52,14 @@ int main(int argc, char **argv)
     {
     	gtk_init(&argc, &argv);
     
    -	GtkWidget *window, *table, *bunit, *bdiz, *etiquet, * ledAFF;
    +	GtkWidget *window, *table, *bunit, *bdiz, *etiquet;
     
     	StructDat *data;
     	data = g_slice_new( StructDat);
     
     	data->ledOFF = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
     	data->ledON = gdk_pixbuf_new_from_file ("./led_on.png", NULL);
    +	data->led = data->ledON;
     
     	/* if (label <= 2) { data->led = data->ledON ; }
     	   else data->led = data->ledOFF ; */
    @@ -71,8 +73,8 @@ int main(int argc, char **argv)
     	gtk_container_add( GTK_CONTAINER ( window ), table );
     
     	// gtk_image_set_from_pixbuf(GTK_IMAGE(ledAFF), data->led);
    -	ledAFF = gtk_image_new_from_pixbuf(data->ledON);
    -	gtk_table_attach( GTK_TABLE( table ), ledAFF, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );
    +	data->image = gtk_image_new_from_pixbuf(data->led);
    +	gtk_table_attach( GTK_TABLE( table ), data->image, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );
    Les lignes précédées par un - sont supprimées, les lignes commençant par un + sont ajoutées, les autres restent intactes.

    Sinon il y a quelques années j'ai fait une petite appli exemple qui crée un tableau de leds, qui changent de couleur quand on leur clique dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <gtk/gtk.h>
     
    #define MAX_LEDS_PER_LINE 10
    #define NUM_LEDS 100
     
    static GdkPixbuf * led_on;
    static GdkPixbuf * led_off;
     
    static gboolean click_handler(GtkWidget *widget,
    		GdkEvent *event,
    		gpointer user_data)
    {
    	gboolean *is_led_on = user_data;
    	GList * children = gtk_container_get_children (GTK_CONTAINER (widget));
     
    	*is_led_on = ! *is_led_on; /* invert led state */
    	gtk_image_set_from_pixbuf (GTK_IMAGE(children->data), (*is_led_on) ? led_on : led_off);
    	g_list_free (children);
    	return TRUE; /* stop event propagation */
    }
     
    int main(int argc, char** argv)
    {
    	GtkWidget *window, *table;
    	gboolean leds[NUM_LEDS];
    	int i = 0;
     
    	gtk_init(&argc, &argv);
     
    	/* Create a window */
    	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(window), "LEDs");
    	g_signal_connect(G_OBJECT(window),
    			"destroy",
    			G_CALLBACK(gtk_main_quit),
    			NULL);
     
    	/* Load leds on/off images */
    	led_on = gdk_pixbuf_new_from_file ("../on.png", NULL);
    	led_off = gdk_pixbuf_new_from_file ("../off.png", NULL);
     
    	/* Create the container */
    	int n_rows = (NUM_LEDS / MAX_LEDS_PER_LINE) + 1;
    	int n_cols = (NUM_LEDS / MAX_LEDS_PER_LINE) + 1;
    	table = gtk_table_new (n_rows, n_cols, FALSE);
     
    	/* Create the leds */
    	for (i = 0; i < NUM_LEDS; i++)
    	{
    		leds[i] = FALSE; /* FALSE means OFF, TRUE means ON */
     
    		/*
    		 * A GtkImage doesn't have a window, so we need to put it inside
    		 * a GtkEventBox so we can capture events.
    		 */
    		GtkWidget *image = gtk_image_new ();
    		gtk_image_set_from_pixbuf (GTK_IMAGE(image), led_off);
    		GtkWidget *eb = gtk_event_box_new();
    		g_signal_connect(G_OBJECT(eb),
    				"button-press-event",
    				G_CALLBACK(click_handler),
    				&leds[i]);
    		gtk_container_add(GTK_CONTAINER(eb), image);
    		int row = i / MAX_LEDS_PER_LINE;
    		int col = i % MAX_LEDS_PER_LINE;
    		gtk_table_attach (GTK_TABLE(table),
    				eb,
    				row, row + 1,
    				col, col + 1,
    				0,
    				0,
    				0,
    				0);
    	}
     
    	gtk_container_add(GTK_CONTAINER(window), table);
    	gtk_widget_show_all(window);
     
    	gtk_main();
     
    	return 0;
    }
    Les images s'appellent on.png et off.png et doivent se situer un niveau d'arborescence plus haut que l'exécutable généré.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    un Très grand merci liberforce, j'essaye ce que tu a écris après manger.
    Je suis sous ubuntu 12.04 et 14.04 sachant que les version de gcc et codeblock, etc ... ne sont pas les mêmes. Pour codeblock c'est 10.02 et 13.12 et pour les OS c'est pour win7 et surtout environnement linux. Je vous tiens au courant ........

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    re-re liberforce. Le premier source que tu m'a indiqué fonctionne comme je le souhaite. Cool, Merci
    Débutant en GTK et loin d'estre au top en C je savais que le progr démarrait avec le main() mais je ne savais pas si la boucle main tournait en permanence, bref de la ligne 51 à 100 en boucle. Maintenant je comprend mieux. J'en déduis que les lignes 60,31 et 62 ne s'exécutent qu'une fois et qu'il en est de même pour les lignes 76,80 et 84 si j'ai bien compris.
    Sinon pour le déboggeur je m'y intéresse avec ce que me fournissent Codeblock et gdb et les printf dans une console aussi. En fait je voulais regarder de près les variables.
    Aussi j'avais trouvé par hasard le code que tu m'a fourni sur le tableau de led sur stackoverflow, j'en suis sûrement pas encore a ce niveau.
    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer l'image affichée dans le temp
    Par Elazael dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/10/2008, 11h47
  2. Afficher tout type d'image (gif ,png, jpg...)
    Par jfb53 dans le forum C++Builder
    Réponses: 22
    Dernier message: 20/07/2005, 14h52
  3. Afficher et comparer 2 images bitmap
    Par leplusnul dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2004, 16h54
  4. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo