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 :

Erreur gtk-critical, que faire ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Erreur gtk-critical, que faire ?
    Bonjour,
    je suis en train de faire un petit programme, je suis juste au commencement, mais déjà les erreurs apparaissent.

    But:
    récupérer un fichier texte,
    réaliser un traitement particulier sur le texte à l'intérieur de ce fichier,
    enregistrer ensuite cette modification dans un autre fichier texte.

    je l'ai déjà réaliser en ligne de commande et je souhaite m'amuser à faire une petite interface graphique.


    Mon programme est :
    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
     
    #include <gtk/gtk.h>
     
     
    int main (int argc, char *argv[])
    {
        GtkBuilder *builder;
        GtkWidget *window;
        //char *filename;
        gtk_init (&argc, &argv);
     
        builder = gtk_builder_new ();
        gtk_builder_add_from_file (builder, "interfaceSms.glade", NULL);
     
        window = GTK_WIDGET (gtk_builder_get_objects (builder));
        gtk_builder_connect_signals (builder, NULL);
     
        g_object_unref (G_OBJECT (builder));
     
        gtk_widget_show (window);
        gtk_main ();
     
    return 0;
    }
     
    void on_window_destroy (GtkObject *object, gpointer user_data)
    {
        gtk_main_quit ();
    }
    void on_process_pressed (GtkObject *object, gpointer user_data)
    {
        printf("button pressed\n");
        //printf("%s\n",filename);
    }
    void on_choice_file_set (GtkObject *object, gpointer user_data)
    {
        char *filename;
        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (object));
        printf("%s\n",filename);
    }
    Les erreurs sont :
    (PhoneNumberWithInterface:3891): GLib-GObject-WARNING **: invalid uninstantiatable type `(null)' in cast to `GtkWidget'

    (PhoneNumberWithInterface:3891): Gtk-WARNING **: Could not find signal handler 'on_window_destroy'

    (PhoneNumberWithInterface:3891): Gtk-WARNING **: Could not find signal handler 'on_process_pressed'

    (PhoneNumberWithInterface:3891): Gtk-WARNING **: Could not find signal handler 'on_choice_file_set'

    (PhoneNumberWithInterface:3891): Gtk-CRITICAL **: IA__gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed

    J'ai chargé au préalable le fichier de l'interface réalisé sous glade (joint ici).

    Auriez vous des idées pour m'aider à corriger ces erreurs (j'ai compilé sous eclipse avec les options wall ,g3 et bien sûr `pkg-config --cflags --libs gtk+-2.0`)

    Avez-vous des idées ?

    Merci de votre aide !!
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Déjà dans la compilation il manque le --Wl,export-all-symbols pour les signaux glade.

    Après pourquoi faire un unref sur un objet qui est en cours d'utilisaiton?

  3. #3
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut
    Merci Slash pour ta réponse,
    en ligne de commande, je compile avec :
    gcc -Wall -g3 PhoneNumberWithInterface.c -o interfaceSms -export-dynamic `pkg-config --cflags --libs gtk+-2.0`
    et je n'ai pas d'erreur.

    Avec eclipse,tu as raison de me rappeler que je n'ai pas ajouté -export-dynamic...
    J'ai donc ajouté -export-dynamique, mais pas concluant...lorsque je "build" (désolé pour l'anglissisme), je l'impression qu'eclipse part dans une boucle infinie.

    Tu suggère d'ajouter les option dans gcc
    gcc -Wall -g3 --WI,export-all-symbols `pkg-config --cflags --libs gtk+-2.0`
    Est-ce correcte ?

    J'ai utiliser unref pour libérer la mémoire.

    Bonne journée

    PS : je suis sous Ubuntu...

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    La remarque de _-Slash-_ correspond justement au problème rencontré. Tu libères les pointeurs dont ton interface à besoin. D'où les warnings en console.
    Le GtkBuilder* ne doit être libéré qu'une fois l'interface devenue inutile. Dans ton cas après le gtk_main();.

  5. #5
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut
    Merci pour vos réponses,

    j'ai donc corrigé mon code en tenant compte de vos conseils.
    Des warnings ont disparu, mais pas l'erreur critique de gtk...

    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
    #include <gtk/gtk.h>
     
     
    int main (int argc, char *argv[])
    {
        GtkBuilder *builder;
        GtkWidget *window;
        //char *filename;
        gtk_init (&argc, &argv);
     
        builder = gtk_builder_new ();
        gtk_builder_add_from_file (builder, "interfaceSms.glade", NULL);
     
        window = GTK_WIDGET (gtk_builder_get_objects (builder));
        gtk_builder_connect_signals (builder, NULL);
     
        gtk_widget_show (window);
        gtk_main ();
        g_object_unref (G_OBJECT (builder));
     
    return 0;
    }
     
    void on_window_destroy (GtkObject *object, gpointer user_data)
    {
        gtk_main_quit ();
    }
    void on_process_pressed (GtkObject *object, gpointer user_data)
    {
        printf("button pressed\n");
        //printf("%s\n",filename);
    }
    void on_choice_file_set (GtkObject *object, gpointer user_data)
    {
        char *filename;
        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (object));
        printf("%s\n",filename);
    }
    Messages d'erreurs :
    (interfaceSms:3526): GLib-GObject-WARNING **: invalid cast from `(null)' to `GtkWidget'

    (interfaceSms:3526): Gtk-CRITICAL **: IA__gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
    J'ai l'impression que l'erreur critique vient peut-être du fait que je cherche à afficher un gtkwidget null, comme le suggère le warning, mais je ne sais pas comment vérifier cela. Auriez-vous des idées ?

    Bonne journée

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    gtk_builder_get_objects(); renvoie un GSList* et non un GtkWidget*. La liste retournée contient tous les widgets de l'interface.
    Il faut utiliser à la place gtk_builder_get_object();. On indique à cette fonction le nom du widget que l'on désire récupérer et en retour on accède au pointeur générique GObject* qu'il suffit de caster.

  7. #7
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut
    Merci beaucoup pour cette réponse, effectivement, j'aurais du mieux lire le manuel .
    Du coup, ça marche...
    Du coup, j'ai une autre question :
    comment faire pour afficher les éléments que je stock dans une Gtkwidget et dans une glist ?
    Merci de votre aide, je vous souhaite une bonne journée.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Ne sachant pas ce que contient ta GSList* je ne peux pas répondre à cette question. Cependant j'ai l'impression que ta question est plutôt : "Comment afficher tous les widgets de ma fenêtre?". Si je ne me trompe pas voila la réponse.

    Lorsque tu utilises la fonction gtk_widget_show_all(GtkWidget* fenetre); tous les widgets contenus fenetre seront automatiquement affichés. Donc pas besoin de forcer l'affichage pour chacun d'entre eux.

    En espérant avoir répondu à tes attentes...

  9. #9
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut
    Merci Gérard3d de ton opiniâtreté à répondre à mes questionnements...
    En effet, Glist est une structure...donc, selon ce que l'on met dedans...

    En revanche, lorsque j'affecte ma variable window :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
    j'aimerai savoir comment faire pour visualiser ma variable window.

    Sauriez-vous comment faire ?

    Bonne journée

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Tout simplement en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_show_all (window);

Discussions similaires

  1. Erreur Gtk-CRITICAL dans une fenêtre secondaire
    Par Ridbark dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 03/05/2011, 20h10
  2. Réponses: 5
    Dernier message: 26/04/2010, 10h52
  3. erreur gtk critical
    Par muskachew dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 27/06/2009, 09h46
  4. Que faire qd "erreur de segmentation sous kdev
    Par Lord Van dans le forum Linux
    Réponses: 7
    Dernier message: 27/12/2005, 20h44

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