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 :

Probleme ajout label dans une fenetre


Sujet :

GTK+ avec C & C++

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Probleme ajout label dans une fenetre
    Bonjour à tous,

    Je débute dans le programmation avec gtk+2.
    J'ai fais une fenetre, j'aimerais y ajouter un label mais ça plante..la compilation passe nickel mais j'ai ça à l'éxécution :
    (prog:5761): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkContainer'

    (prog:5761): Gtk-CRITICAL **: gtk_container_add: assertion `GTK_IS_CONTAINER (container)' failed
    Et aucun label..

    Voici 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
    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
    #include <gtk/gtk.h>
     
    /*Déclarations des fonctions*/
    void fermetureFenetre(GtkWidget *pFenetre,gpointer data);
    void afficherFenetre(GtkWidget *pFenetre,const gchar *titre, int largeur,int hauteur);
    void afficherLabel(GtkWidget *pLabel,GtkWidget *pFenetre, const char *texte);
     
    /*Fonction qui ferme le fenetre*/
    void fermetureFenetre(GtkWidget *pFenetre,gpointer data)
    {
        gtk_main_quit();
    }
     
    /*Fonction qui affiche une fenetre*/
    void afficherFenetre(GtkWidget *pFenetre,const gchar *titre, int largeur, int hauteur)
    {
      /*Initialisation*/
      pFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL); //création
      gtk_window_set_title(GTK_WINDOW(pFenetre),titre); //titre fenetre
      gtk_window_set_default_size(GTK_WINDOW(pFenetre),largeur,hauteur); //taille
      gtk_window_set_position(GTK_WINDOW(pFenetre),GTK_WIN_POS_CENTER); //position centrée
     
      /*Connection du signal de fermeture*/
      g_signal_connect(G_OBJECT(pFenetre),"destroy",G_CALLBACK(fermetureFenetre),NULL);
     
      /*Affichage fenetre*/
      gtk_widget_show_all(pFenetre);
    }
     
    /*Fonction qui affiche un label dans une fenetre*/
    void afficherLabel(GtkWidget *pLabel, GtkWidget *pFenetre, const char *texte)
    {
      pLabel = gtk_label_new("texte"); //création du label
      gtk_container_add(GTK_CONTAINER(pFenetre),pLabel); //ajout du label dans la fenetre
    }
     
     
     
    int main(int argc, char *argv[] )
    {
      /*Déclaration des variables*/
        GtkWidget *pFenetrePrincipale;
        GtkWidget *pLabelIP;
     
     
      /*Initialisation de GTK*/
      gtk_init(&argc,&argv);
     
      /*Affichage de la fenetre*/
      afficherFenetre(pFenetrePrincipale,"Fenetre principale",400,400);
      /*Ajout du label*/
      afficherLabel(pLabelIP,pFenetrePrincipale,"Entrez l'IP du serveur");
     
      /*Lancement de la boucle evennementille infini*/
      gtk_main();
     
      /*Fin du programme sans erreur*/
      return 0;
    }
    Voila, j'espere que c'est rien de méchant..merci pour votre aide
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut

    Je pense que ça vient du fait que tu crées ta fenêtre dans une fonction (la première). Donc quand tu y sors, la fenêtre n'existe plus.
    Il faudrait passer l'adresse de la fenêtre (ce qui donne un GtkWidget**) ou bien retourner son adresse.
    De plus (sans rapport avec le problème), il faut enlever les guillemets pour le texte du label si t'utilises la chaine texte

    Nas'

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Oui pour les guillemets je sais je les avais mis pour voir si ça changeait quelque chose au probleme

    Je vais essayer de faire comme tu m'as dit.
    Merci
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai remplacé comme cela :
    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
     
    #include <gtk/gtk.h>
     
    /*Déclarations des fonctions*/
    void fermetureFenetre(GtkWidget *pFenetre,gpointer data);
    void afficherFenetre(GtkWidget **pFenetre,const gchar *titre, int largeur,int hauteur);
    void afficherLabel(GtkWidget *pLabel,GtkWidget **pFenetre, const char *texte);
     
    /*Fonction qui ferme le fenetre*/
    void fermetureFenetre(GtkWidget *pFenetre,gpointer data)
    {
        gtk_main_quit();
    }
     
    /*Fonction qui affiche une fenetre*/
    void afficherFenetre(GtkWidget **pFenetre,const gchar *titre, int largeur, int hauteur)
    {
      /*Initialisation*/
      *pFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL); //création
      gtk_window_set_title(GTK_WINDOW(pFenetre),titre); //titre fenetre
      gtk_window_set_default_size(GTK_WINDOW(pFenetre),largeur,hauteur); //taille
      gtk_window_set_position(GTK_WINDOW(pFenetre),GTK_WIN_POS_CENTER); //position centrée
     
      /*Connection du signal de fermeture*/
      g_signal_connect(G_OBJECT(pFenetre),"destroy",G_CALLBACK(fermetureFenetre),NULL);
    }
     
    /*Fonction qui affiche un label dans une fenetre*/
    void afficherLabel(GtkWidget *pLabel, GtkWidget **pFenetre, const char *texte)
    {
      pLabel = gtk_label_new(texte); //création du label
      gtk_container_add(GTK_CONTAINER(pFenetre),pLabel); //ajout du label dans la fenetre
    }
     
     
     
    int main(int argc, char *argv[] )
    {
      /*Déclaration des variables*/
        GtkWidget **pFenetrePrincipale;
        GtkWidget *pLabelIP;
     
     
      /*Initialisation de GTK*/
      gtk_init(&argc,&argv);
     
      /*Affichage de la fenetre*/
      afficherFenetre(pFenetrePrincipale,"Fenetre principale",400,400);
      /*Ajout du label*/
      afficherLabel(pLabelIP,pFenetrePrincipale,"Entrez l'IP du serveur");
      gtk_widget_show_all(*pFenetrePrincipale);
      /*Lancement de la boucle evennementille infini*/
      gtk_main();
     
      /*Fin du programme sans erreur*/
      return 0;
    }
    Maintenant j'ai une erreur de segmentation
    J'ai du mal faire...
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Normal Il faut garder le GtkWidget* dans le main mais passer son adresse.
    Donc ta fonction est bonne (sauf qu'il faut ajouter une étoile partout où t'utilises ta fenêtre (taille, titre...)) mais dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GtkWidget *pFenetrePrincipale; 
    /* ... */
    afficherFenetre(&pFenetrePrincipale,"Fenetre principale",400,400);
    /* ... */
    gtk_widget_show_all(pFenetrePrincipale);
    Nas'

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ok je vais essayer
    Merci
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  7. #7
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Alors,
    Ma fonction d'affichage de la fenetre est comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficherFenetre(GtkWidget **pFenetre,const gchar *titre, int largeur,int hauteur);
    Et son appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GtkWidget *pFenetrePrincipale;
    /*...*/
    afficherFenetre(&pFenetrePrincipale,"Fenetre principale",400,400);
    Erreur de compilation(enfin warning)
    cc1: warnings being treated as errors
    main.c: In function ‘afficherFenetre’:
    main.c:18: attention : assignment from incompatible pointer type
    Je dois encore une fois mal faire quelque chose..
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  8. #8
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    T'as vu que j'avais édité mon dernier message? Il faut modifier toutes les occurences de ta fenêtre dans la fonction (rajouter une étoile). Peut-être est-ce cela car l'appel est bon.

    Nas'

  9. #9
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ok j'avais pas vu mais j'aurais du y penser

    Alors re-voila la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /*Fonction qui affiche une fenetre*/
    void afficherFenetre(GtkWidget **pFenetre,const gchar *titre, int largeur, int hauteur)
    {
      /*Initialisation*/
      *pFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL); //création
      gtk_window_set_title(GTK_WINDOW(*pFenetre),titre); //titre fenetre
      gtk_window_set_default_size(GTK_WINDOW(*pFenetre),largeur,hauteur); //taille
      gtk_window_set_position(GTK_WINDOW(*pFenetre),GTK_WIN_POS_CENTER); //position centrée
     
      /*Connection du signal de fermeture*/
      g_signal_connect(G_OBJECT(*pFenetre),"destroy",G_CALLBACK(fermetureFenetre),NULL);
    }
    Ca fonctionne parfaitement. Merci pour ton aide.
    Juste une question, je debute sur gtk, c'est une bonne écriture ? je veux dire de faire des fonctions comme ça, puis d'afficher tout à la fin, ou il y a mieux ?

    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ah j'oubliais, il y a moyen de positionner le label où on veut ?
    Car au final je veux mettre 2 zones de saisies, avec donc un label juste au dessus de chacune..donc il faudrait pouvoir mettre des coordonnées
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  11. #11
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Je ne suis pas expert en GTK donc...
    Mais ça me semble bien de faire des fonctions. Cependant, comme tu débutes, je pense que tu n'as pas encore abordé les boxes et tables.
    Car pour ajouter plusieurs composants (2 labels par exemple), il faut passer par ce mécanisme et non par la fonction gtk_container_add().
    Mais quoiqu'il en soit, décomposer en plusieurs sous-programmes, c'est très bien
    EDIT : pour placer les composants, faut justement passer par les tables ou boxes

    Nas'

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Les boxes et les tables..ok je vais voir ça.
    Merci
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

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

Discussions similaires

  1. [XL-2007] Ajouter un login + Mot de passe dans une fenetre
    Par lenovo49 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 15/11/2011, 14h09
  2. Réponses: 1
    Dernier message: 14/02/2011, 09h28
  3. probleme de disposition avec GridBagLayout dans une fenetre
    Par thierry_b dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 17/07/2009, 11h08
  4. Ajouter un image dans une fenetre
    Par AbouraStat dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/05/2009, 20h49
  5. Probleme d'affichage d'image dans une fenetre
    Par cgregueusse dans le forum MFC
    Réponses: 1
    Dernier message: 03/08/2005, 11h08

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