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 :

Pbm de débutant - set label


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut Pbm de débutant - set label
    Bonjour à tous.

    Je suis un peu débutant en programmation GTK, je pige pas grand chose et j'aurais besoin de votre aide.

    J'ai crée avec glade une petite interface basique comportant un label et un bouton et j'aimerais que lorsque l'on clique sur le bouton, le label change...
    C'est un exemple un peu bidon, de base, mais j'apprends... tant bien que mal.
    J'ai lu quelques tuto ici et là, je me suis inspiré d'exemples, mais je coince un peu.

    Problème, je n'arrive pas au résultat, je vous livre mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <gtk/gtk.h>
     
     
    static void clic_bouton (GtkLabel * plabel, gpointer p_lab)
    {
    	const char * str;
    	str = "EJECT";
     
    	//printf("solution %s \n", p_str);
     
    	gtk_label_set_label(GTK_LABEL((GtkLabel*)p_lab), str);
     
    }
    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
     
     
    int main( int argc, char **argv )
    {
        GtkBuilder *builder;
        GtkWidget  *window;
        GtkLabel *label;
        GError     *error = NULL;
     
        /* Init GTK+ */
        gtk_init( &argc, &argv );
     
        /* Create new GtkBuilder object */
        builder = gtk_builder_new();
        /* Load UI from file. If error occurs, report it and quit application.
         * Replace "tut.glade" with your saved project. */
        if( ! gtk_builder_add_from_file( builder, "Test_interface.xml", &error ) )
        {
            g_warning( "%s", error->message );
            g_free( error );
            return( 1 );
        }
     
        /* Get main window pointer from UI */
        window = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );
        label = GTK_LABEL( gtk_builder_get_object( builder, "label1" ) );
     
        /* Connect signals */
        g_signal_connect(
        		gtk_builder_get_object( builder, "bouton" ),"clicked",
        		G_CALLBACK (clic_bouton),
        	    (GtkLabel*) label
        );
     
        /* Destroy builder, since we don't need it anymore */
        g_object_unref( G_OBJECT( builder ) );
     
        /* Show window. All other widgets are automatically shown by GtkBuilder */
        gtk_widget_show( window );
     
        /* Start main loop */
        gtk_main();
     
        return( 0 );
    }
    J'obtiens l'erreur:

    Gtk-CRITICAL **: gtk_label_set_label: assertion 'GTK_IS_LABEL (label)' failed
    Bon d'après ce que je comprends, j'ai un problème avec ma variable "label", mais où ça je sais pas. Je pense que les experts trouveront vite ce qui cloche dans mon code.

    Merci beaucoup pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Hmm, essaie d'enlever le " g_object_unref( G_OBJECT( builder ) );" pour voir si ça aide (je dis pas que c'est ce qu'il faut faire, je me demande juste si ça peut venir de là ou non)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Malheureusement, pas d'effet

  4. #4
    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
    Par défaut
    Bon, j'ai eu du mal à le voir, je pensais que c'était peu être label qui valait NULL et faisait échouer GTK_LABEL (qui effectue un cast et vérifie que la variable est bien convertible dans ce type).

    Et puis pouf, j'ai vu que ce n'était pas à la connexion du signal, mais au niveau de la callback... Le signal "clicked" que tu connectes provient d'un GtkButton, et tu ne respectes pas le prototype de la callback correspondante... Le premier paramètre est l'object qui a reçu le signal, et c'est un bouton.
    Toi tu as mis que c'était un label.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Si je comprends pas bien.

    Donc si je te suis, dans ma fonction clic_bouton, je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void clic_bouton (GtkLabel * plabel, gpointer p_lab)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void clic_bouton (GtkButton * pbutton, gpointer p_lab)
    Si c'est bien ça, pareil j'ai toujours le même problème en fait.

  6. #6
    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
    Par défaut
    Hum... Bizarre...
    Tu peux mettre un un appel à avant chaque ligne où tu appelles la macro GTK_LABEL, et poster ton code sur http://pastebin.org/ (comme ça on aura les numéros de lignes) ? Indique nous ensuite ici ce que t'affiche le programme, pour savoir à quelle ligne ça pète.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Ok problème réglé,
    J'avais un soucis dans la récupération du label de mon fichier Glade...
    Un truc con... j'ai honte de vous avoir fait perdre du temps ...


    Je commence à piger un peu.

    Merci beaucoup pour votre aide.
    Ce forum est vraiment une aide essentiel ! Bravo à tous les contributeurs

  8. #8
    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
    Par défaut
    Faut croire que ma première explication était la bonne alors ;-)

    Ce que tu dois retenir, c'est ça : avant de poster utilise un débogueur pour voir où ça plante, en mettant des points d'arrêt autour de l'endroit qui coince, ou utilise la méthode du "printf debugging", qui en gros te pousse à mettre des printf un peu partout pour trouver à quelle ligne ça coince.

    Perso, j'utilise g_debug (G_STRLOC), qui est court, se copie/colle bien, donne le numéro de ligne et le nom de fichier. En plus au moment d'éliminer ce code de débogage, ça se retrouve facilement en recherchant g_debug et ça évite de virer des printf qui étaient là avant.

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Dans le cas d'un warning affiché par gtk+, tu peux lancer l'appli dans gdb avec --g-fatal-warnings (ou la variable d'env équivalente), ou bien mettre un breakpoint sur g_log, comme ça gdb s'arrêtera tout seul sur les warnings gtk+

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Faut croire que ma première explication était la bonne alors ;-)

    Ce que tu dois retenir, c'est ça : avant de poster utilise un débogueur pour voir où ça plante, en mettant des points d'arrêt autour de l'endroit qui coince, ou utilise la méthode du "printf debugging", qui en gros te pousse à mettre des printf un peu partout pour trouver à quelle ligne ça coince.

    Perso, j'utilise g_debug (G_STRLOC), qui est court, se copie/colle bien, donne le numéro de ligne et le nom de fichier. En plus au moment d'éliminer ce code de débogage, ça se retrouve facilement en recherchant g_debug et ça évite de virer des printf qui étaient là avant.
    Le soucis d'un novice c'est qu'il a parfois du mal à avoir le réflex débugueur
    Enfin là, le programme compilait correctement (donc la méthode des printf aurait été inefficace) et donc j'étais un peu perdu...
    D'autant plus que je plaçais la faute sur ces histoires de pointeurs éventuellement mal utilisés.
    En fin de compte, le manque de clarté des erreurs fait qu'on se dirige vers les mauvaises solutions et c'est dommage.

    Mais je retiens le conseil, merci beaucoup pour ton aide

    Dans le cas d'un warning affiché par gtk+, tu peux lancer l'appli dans gdb avec --g-fatal-warnings (ou la variable d'env équivalente), ou bien mettre un breakpoint sur g_log, comme ça gdb s'arrêtera tout seul sur les warnings gtk+
    Là c'est un peu opaque pour moi. Je vais creuser un peu.
    Si vous avez des exemple de code où l'on utilise ces g_log ou G_STRLOC,
    je suis preneur, en attendant direction google pour savoir de quoi vous me parlez.

    Merci encore

  11. #11
    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
    Par défaut
    Citation Envoyé par ArnSpin Voir le message
    Enfin là, le programme compilait correctement (donc la méthode des printf aurait été inefficace)
    Pas du tout, le printf-debugging, ça sert justement quand ça compile, mais que tu as une erreur à l'exécution. Le but c'est juste de retrouver quelle ligne de code a produit ton message ou ton erreur, en l'entourant de messages.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int *toto = NULL;
    g_debug (G_STRLOC);
    *toto = 42;
    g_debug (G_STRLOC);
    Ici, le pointeur toto ne pointe pas sur une zone mémoire valide, donc *toto provoquera un crash à tous les coups. Ton premier message s'affichera, avec le nom de fichier et la ligne en cours, puis tu auras un crash, et le message suivant ne sera jamais affiché. Tu sais donc que ton erreur se situe entre ton dernier message affiché et le suivant.

    La manipulation est assez simple, tu mets quelques g_debug (G_STRLOC) autour de l'endroit où tu penses que ça crashe, puis tu procèdes par dichotomie pour retrouver au fur et à mesure l'endroit exact du problème.

    Sinon, si tu as une idée précise, tu peux aussi utiliser g_assert qui va vérifier qu'une condition est vraie. Dans ton code, ceci aurait suffit à mettre en valeur le bug.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    label = GTK_LABEL( gtk_builder_get_object( builder, "label1" ) );
    g_assert (label != NULL);
    Les assertions, contrairement aux dérivés de printf comme g_debug, peuvent rester dans le code final. C'est une bonne pratique d'en mettre si tu veux éviter que ton programme ne fasse n'importe quoi, et permet de détecter des erreurs de programmation durant l'exécution. Il aussi possible de les désactiver au moment de la compilation si tu veux alléger ton code. Les instructions g_assert ne seront alors pas exécutées. Cela se fait en définissant le symbole G_DISABLE_ASSERT à la compilation.

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

Discussions similaires

  1. gtk set label text:assertion ' gtk is label
    Par cabiste007 dans le forum GTK+
    Réponses: 1
    Dernier message: 29/03/2015, 21h36
  2. [LV 6.1][Débutant] Set/Reset
    Par Griffiths dans le forum LabVIEW
    Réponses: 3
    Dernier message: 29/04/2011, 11h28
  3. [débutant]contenu label = variable + texte
    Par gpgp007 dans le forum C#
    Réponses: 4
    Dernier message: 27/01/2009, 21h16
  4. [débutant] set linesize me fait n'importe quoi
    Par Mathusalem dans le forum Oracle
    Réponses: 6
    Dernier message: 20/04/2006, 16h22
  5. MYSQL 5 alpha Win - pbm création base - Débutant
    Par nerick dans le forum Débuter
    Réponses: 8
    Dernier message: 13/04/2004, 14h56

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