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 :

Bouton au comportement étrange


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut Bouton au comportement étrange
    Bonjour,
    Je débute dans la programmation GTK.
    Mon souci se situe dans une boîte de dialogue, dans laquelle j'ai ajouté trois boutons :
    • un bouton pour ouvrir un FileChooser qui ouvrirait un dossier Musique
    • un second bouton qui ouvrirait aussi un FileChooser pour un dossier Vidéos
    • un dernier bouton pour refermer la boîte de dialogue


    Pour créer ces différents boutons, j'utilise un tableau de quatre boutons, car sinon, l'appui sur le premier bouton ne fonctionne pas.
    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
    void LanceVlc(void)
    {
        /*Initialisation des Widgets*/
        GtkWidget *pBoite;
        GtkWidget *pBouton[3];
        GtkWidget *pImage[3];
        GtkTooltips *pTool;
     
        /*La Boite est une boîte de dialogue*/
        pBoite = gtk_dialog_new();
        /*Texte de la boîte de ialogue*/
        gtk_window_set_title(GTK_WINDOW(pBoite), "Choisissez votre média.");
        /*Icone dans la barre de titre*/
        gtk_window_set_icon_from_file(GTK_WINDOW(pBoite), "./vlc.png", NULL);
        /*Bulle d'aide*/
        pTool = gtk_tooltips_new();
        /*Bouton 1*/
        pBouton[1] = gtk_button_new();
        /*Image du bouton*/
        pImage[1] = gtk_image_new_from_file("./video.png");
        /*Bulle d'aide associée au bouton n°0*/
        gtk_tooltips_set_tip(pTool, pBouton[1], "Ouvrir une vidéo avec VLC", NULL);
        /*Ajout de l'icône dans le bouton*/
        gtk_container_add(GTK_CONTAINER(pBouton[1]), (GtkWidget *)pImage[1]);
        /*Ajout du bouton dans la boîte de dialogue*/
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->action_area), pBouton[1], TRUE, TRUE, 10);
        /*Bouton 2*/
        pBouton[2] = gtk_button_new();
        /*Image 2*/
        pImage[2] = gtk_image_new_from_file("./musique.png");
        /*Bulle d'aide associée au bouton 2*/
        gtk_tooltips_set_tip(pTool, pBouton[2], "Ouvrir une piste musicale avec VLC", NULL);
        /*Ajout de l'icone dans le bouton*/
        gtk_container_add(GTK_CONTAINER(pBouton[2]), (GtkWidget *)pImage[2]);
        /*Ajout du bouton dans la boîte de dialogue*/
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->action_area), pBouton[2], TRUE, TRUE, 10);
        /*Bouton 3 : Annuler*/
        pBouton[3] = gtk_button_new();
        /*Image 3*/
        pImage[3] = gtk_image_new_from_file("./retour.png");
        /*Ajout de l'icone dans le bouton*/
        gtk_container_add(GTK_CONTAINER(pBouton[3]), (GtkWidget *)pImage[3]);
        /*Ajout du bouton dans la fenêtre*/
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->action_area), pBouton[3], TRUE, TRUE, 10);
        /*Connexion du "clic" à la fonction creer_fichiers_selection_video*/
        g_signal_connect(G_OBJECT(pBouton[1]), "clicked", G_CALLBACK(creer_fichiers_selection_video), NULL);
        /*Connexion du "clic à la fonction creer_fichiers_selection_audio*/
        g_signal_connect(G_OBJECT(pBouton[2]), "clicked", G_CALLBACK(creer_fichiers_selection_audio), NULL);
        /*Connexion de destroy au clic sur le bouton 3*/
        g_signal_connect_swapped(G_OBJECT(pBouton[3]), "clicked", G_CALLBACK(gtk_widget_destroy), pBoite);
        /*Et l'on montre le tout*/
        gtk_widget_show_all(pBoite);
    }
    Y'a-t-il une raison cohérente pour que je sois obligée d'éviter d'utiliser le pBouton[0] ?

  2. #2
    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
    Bonjour,
    tu te trompes dans les indices d'accès à ton tableau.
    Si tu déclares ton tableau de pointeurs ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GtkWidget *pBouton[3];
    GtkWidget *pImage[3];
    Alors tu peux accéder aux éléments 0, 1, et 2. Dans ton codes tu accèdes aux éléments 1, 2 et 3... La numérotation des indices dans un tableau commence à 0.

  3. #3
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Bonjour,
    tu te trompes dans les indices d'accès à ton tableau.
    Si tu déclares ton tableau de pointeurs ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GtkWidget *pBouton[3];
    GtkWidget *pImage[3];
    Alors tu peux accéder aux éléments 0, 1, et 2. Dans ton codes tu accèdes aux éléments 1, 2 et 3... La numérotation des indices dans un tableau commence à 0.
    Eh bien justement, si je déclare un tableau de trois pointeurs (soit pBouton[2]), le pBouton[0] n'active rien (en ayant bien sûr changé ce qui doit être changé).

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par cypher.sephiroth Voir le message
    Eh bien justement, si je déclare un tableau de trois pointeurs (soit pBouton[2]), le pBouton[0] n'active rien (en ayant bien sûr changé ce qui doit être changé).
    Non ! Lors de la déclaration, le nombre entre crochets est le nombre d'éléments, ici 3, ensuite tu accède au éléments avec leur indice commençant à 0, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GtkWidget pBouton[3];
     
    pBouton[0] = ...;
    pBouton[1] = ...;
    pBouton[2] = ...;

  5. #5
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Je m'explique mal :

    Lors de mes premiers essais, le code était le suivant :
    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
    void LanceVlc(void)
    {
        /*Initialisation des Widgets*/
        GtkWidget *pBoite;
        GtkWidget *pBouton[2];
        GtkWidget *pImage[2];
        GtkTooltips *pTool;
     
        /*La Boite est une boîte de dialogue*/
        pBoite = gtk_dialog_new();
        /*Texte de la boîte de ialogue*/
        gtk_window_set_title(GTK_WINDOW(pBoite), "Choisissez votre média.");
        /*Icone dans la barre de titre*/
        gtk_window_set_icon_from_file(GTK_WINDOW(pBoite), "./vlc.png", NULL);
        /*Bulle d'aide*/
        pTool = gtk_tooltips_new();
        /*Bouton n°1*/
        pBouton[0] = gtk_button_new();
        /*Image du bouton*/
        pImage[0] = gtk_image_new_from_file("./video.png");
        /*Bulle d'aide associée au bouton n°1*/
        gtk_tooltips_set_tip(pTool, pBouton[0], "Ouvrir une vidéo avec VLC", NULL);
        /*Ajout de l'icône dans le bouton*/
        gtk_container_add(GTK_CONTAINER(pBouton[0]), (GtkWidget *)pImage[0]);
        /*Ajout du bouton dans la boîte de dialogue*/
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->action_area), pBouton[0], TRUE, TRUE, 10);
        /*Bouton n°2*/
        pBouton[1] = gtk_button_new();
        /*Image n°2*/
        pImage[1] = gtk_image_new_from_file("./musique.png");
        /*Bulle d'aide associée au bouton 2*/
        gtk_tooltips_set_tip(pTool, pBouton[1], "Ouvrir une piste musicale avec VLC", NULL);
        /*Ajout de l'icone dans le bouton*/
        gtk_container_add(GTK_CONTAINER(pBouton[1]), (GtkWidget *)pImage[1]);
        /*Ajout du bouton dans la boîte de dialogue*/
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->action_area), pBouton[1], TRUE, TRUE, 10);
        /*Bouton 3 : Annuler*/
        pBouton[2] = gtk_button_new();
        /*Image 3*/
        pImage[2] = gtk_image_new_from_file("./retour.png");
        /*Ajout de l'icone dans le bouton*/
        gtk_container_add(GTK_CONTAINER(pBouton[2]), (GtkWidget *)pImage[2]);
        /*Ajout du bouton dans la fenêtre*/
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->action_area), pBouton[2], TRUE, TRUE, 10);
        /*Connextion du signal "clic" à la fonction creer_fichiers_selection_video*/
        gtk_signal_connect(GTK_OBJECT(pBouton[0]), "clicked", (GtkSignalFunc)creer_fichiers_selection_video, NULL);
        /*Connexion du signal "clic" à la fonction creer_fichiers_selection_audio*/
        gtk_signal_connect(GTK_OBJECT(pBouton[1]), "clicked", (GtkSignalFunc)creer_fichiers_selection_audio, NULL);
        /*Connexion de destroy au clic sur le bouton 3*/
        g_signal_connect_swapped(G_OBJECT(pBouton[3]), "clicked", G_CALLBACK(gtk_widget_destroy), pBoite);
        /*Et l'on montre le tout*/
        gtk_widget_show_all(pBoite);
    }
    Et le clic sur le premier bouton (pBouton[0]) ne produisait rien. Comme je souhaiterais savoir ce qui posait problème, je m'adresse ici.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Pourrez-ton voir le prototypes des différents callback?

    PS: Erreur sur le signal pour quitter. pBouton[2] et non pBouton[3].

  7. #7
    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
    Comme te l'as fait remarquer gege, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        GtkWidget *pBouton[2];
        pBouton[2] = gtk_button_new();
    Quand tu accèdes en dehors des limites d'un tableau, tout peut arriver (je dis bien tout, y compris kidnapping de ton chien, explosion de ton appartement, ...). Donc commence par corriger ça, si le problème se produit encore, on pourra continuer à réfléchir à ce qui ne va pas.

  8. #8
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Comme te l'as fait remarquer gege, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        GtkWidget *pBouton[2];
        pBouton[2] = gtk_button_new();
    Quand tu accèdes en dehors des limites d'un tableau, tout peut arriver (je dis bien tout, y compris kidnapping de ton chien, explosion de ton appartement, ...). Donc commence par corriger ça, si le problème se produit encore, on pourra continuer à réfléchir à ce qui ne va pas.
    Ah ben d'accord. Je comprends mieux pourquoi mon chien a disparu, alors !
    Merci.

  9. #9
    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
    Au fait, gtk_signal_connect est déprécié, il faut utiliser g_signal_connect à la place. Compile avec G_DISABLE_DEPRECATED et GTK_DISABLE_DEPRECATED définis pour éviter d'utiliser des symboles dépréciés.

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

Discussions similaires

  1. Réponses: 26
    Dernier message: 03/03/2015, 15h45
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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