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+ Discussion :

C GTK Callback et structure erreur


Sujet :

GTK+

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut C GTK Callback et structure erreur
    Bonjour à tous,

    J'essaye de coder actuellement un petit programme ou l'on peut cliquer sur 2 boutons. Ces boutons permettent d'ouvrir une fenetre et de remplir un petit formulaire. Cependant j'ai 2 petits problèmes, le premier est que la 2e fenetre ne veut pas s'ouvrir sans "une bidouille" (car j'ai au départ crée une structure qui est censé regroupé tous les widgets de la 2e fenetre, cependant je suis forcé de faire un malloc dans la fonction void ce qui n'est pas normal) et la 2e est que je n'arrive pas à récupérer les données du formulaire au moment ou je quitte ma 2e fenetre(elle disparaisse de ma structure qui se trouve dans le main mais qui était pourtant presente dans la fonction void).

    En espérant avoir votre aide! Merci beaucoup !

    P.S: j'ai parfois mis des choses en commentaire, en général ce sont des tests que j'ai fait pour "resoudre" le problème mais sans succès
    Edit: Après quelques tests supplémentaires ( initialisation de wind_aj->media titre,isbn,auteur,date dans le main), j'ai remarqué que le problème vient à partir du moment où l'on fait a un callback, c'est comme si wind_aj se formatait.
    main.c
    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
    101
    102
    103
    104
    105
    106
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    #include <gdk-pixbuf/gdk-pixbuf.h>
    #include "graph.h"
     
     
     
    int main(int argc, char **argv)
    {
     
    GtkWidget * bouton1;
    GtkWidget * bouton2;
    GtkWidget* toolbar;
    GtkWidget* vbox;
    GtkWidget* file_selection;
    GtkWidget* scrolled_window;
     
     
    struct fenetre_ajout* wind_aj=(struct fenetre_ajout*)malloc(sizeof(struct fenetre_ajout));
    /*wind_aj->media->titre= malloc(sizeof(char*));
    wind_aj->media->auteur= malloc(sizeof(char*));
    wind_aj->media->date= malloc(sizeof(char*));*/
    /*wind_aj->media->titre= NULL;
    wind_aj->media->auteur= NULL;
    wind_aj->media->date= NULL;*/
     
    gint fhauteur=480;
    gint flargeur=640;
     
             /* Initialisation de GTK+ */
             gtk_init(&argc, &argv);
     
        GtkWidget * MainWindow = NULL; // On déclare notre prochaine fenetre principal
     
            /*Creation fenetre et icone*/
            MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Creation de la fenetre principal
            g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(gtk_main_quit), NULL);
     
                /*Personnalisation fenetre*/
                gtk_window_set_title(GTK_WINDOW(MainWindow),"Media Collection");//titre
     
                /*Position et taille*/
                gtk_window_set_default_size(GTK_WINDOW(MainWindow),flargeur,fhauteur);//taille
                gtk_window_set_position(GTK_WINDOW(MainWindow), GTK_WIN_POS_CENTER);//position
                gtk_window_deiconify(GTK_WINDOW(MainWindow));//deconifier
     
                /*bouton fermer*/
               gtk_window_set_deletable (GTK_WINDOW(MainWindow), TRUE);//activer
     
     
     
            /*Affichage de la fenetre et boucle événementielle*/
                       /*creation vbox*/
     
            /*barre de defilement*/
            /*scrolled_window = gtk_scrolled_window_new (NULL, NULL);
            gtk_container_add(GTK_CONTAINER(MainWindow),scrolled_window);
            vbox=gtk_vbox_new(FALSE,5);
                 
            gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), vbox);
            gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);*/
             vbox=gtk_vbox_new(FALSE,5);    
             gtk_container_add(GTK_CONTAINER(MainWindow),vbox);
            /*Personnalisation barre d'outil*/
                    toolbar= gtk_toolbar_new();
                    gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
     
     
                    /* Création à partir de stock */
                    gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_NEW,"Nouveau",NULL,G_CALLBACK(gtk_main_quit),NULL,-1);
                    gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_OPEN,"Ouvrir",NULL,G_CALLBACK(gtk_main_quit),NULL,-1);
            	gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_APPLY,"Confirmer",NULL,G_CALLBACK(gtk_main_quit),NULL,-1);
            	gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); //ajoute un espace 
            	gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_SAVE,"Enregistrer",NULL,(GCallback)afficher_media_ajout,wind_aj,-1);
                    gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),GTK_STOCK_QUIT,"Fermer",NULL,G_CALLBACK(gtk_main_quit),NULL,-1);
                    gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),GTK_ICON_SIZE_LARGE_TOOLBAR);
     
                    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS ) ;//seulement icone
     
     
     
            /*personnalisation bouton*/
                        bouton1= gtk_button_new_with_label("Ajouter un media");
                        gtk_box_pack_start(GTK_BOX(vbox),bouton1,FALSE , FALSE,0);
                        bouton2=gtk_button_new_with_label("Chercher un media");
                        gtk_box_pack_start(GTK_BOX(vbox),bouton2,FALSE,FALSE,2);
                        g_signal_connect(G_OBJECT(bouton1), "clicked", G_CALLBACK(wind_ajout3), wind_aj);
                        g_signal_connect(G_OBJECT(bouton2), "clicked", G_CALLBACK(gtk_main_quit), NULL);
     
     
     
        /*On affiche 'Fenetre' et tout ce qu'il contient*/
        //gtk_widget_show_all(vbox);
        gtk_widget_show_all(MainWindow);
     
        gtk_main();
     
     
     
        gtk_exit(EXIT_SUCCESS);
     
        // Fermeture de GTK+
     
        return EXIT_SUCCESS;
    }
    graph.c
    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
    101
    102
    103
    104
    #include "graph.h"
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
     gint FH=700;
    gint FL=1000;
     
    void ajout_media_but(GtkWidget *fenetre,GtkWidget *selection, gpointer data){ //ajouter media apres avoir cliquer boutton
    ((struct fenetre_ajout *)data)->media=malloc(sizeof(struct Media));//bidouille
     
     
    ((struct fenetre_ajout*)data)->media->titre=strdup((char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout0)));
    ((struct fenetre_ajout*)data)->media->auteur=(char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout1));
    ((struct fenetre_ajout*)data)->media->date=(char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout2));
    ((struct fenetre_ajout*)data)->media->isbn=atoi((char*)gtk_entry_get_text(GTK_ENTRY(((struct fenetre_ajout*)data)->form_ajout3)));//convertir char* en int atoi
     
    printf("%s \n",((struct fenetre_ajout*)data)->media->auteur);
    printf("%s \n",((struct fenetre_ajout*)data)->media->titre);
    printf("%s \n",((struct fenetre_ajout*)data)->media->date);
    printf("%d \n",((struct fenetre_ajout*)data)->media->isbn);
    }
     
    void wind_ajout3(GtkWidget *fenetre,GtkWidget *selection,gpointer data){
     
       // struct fenetre_ajout* ajout;
     
    //ajout=(struct fenetre_ajout*)malloc(sizeof(struct fenetre_ajout));
    //ajout->media=malloc(sizeof(struct Media));
    /*ajout->media->auteur=malloc(sizeof(char));
    ajout->media->titre=malloc(sizeof(char));
    ajout->media->date=malloc(sizeof(char));*/
     
     
     
        /*creation fenetre+icone*/
        data=(struct fenetre_ajout*)malloc(sizeof(struct fenetre_ajout));//bidouille
        ((struct fenetre_ajout*)data)->fenetre=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre),"Accéder à la bibliotheque multimedia");//titre
        gtk_window_set_modal(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre), TRUE);
        gtk_window_set_default_size(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre),FL-200,FH-100);//taille
        gtk_window_set_position(GTK_WINDOW(((struct fenetre_ajout *)data)->fenetre), GTK_WIN_POS_CENTER);//position
        g_signal_connect(G_OBJECT(((struct fenetre_ajout *)data)->fenetre), "delete-event", G_CALLBACK(gtk_widget_destroy), ((struct fenetre_ajout *)data)->fenetre);
     
     
     
        /*creation box*/
        ((struct fenetre_ajout *)data)->pVBox = gtk_vbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(((struct fenetre_ajout *)data)->fenetre), ((struct fenetre_ajout *)data)->pVBox);
     
        /*Insertion choix*/
     
        /*Insertion tableau pour organiser le formulaire*/
        ((struct fenetre_ajout *)data)->tableau=gtk_table_new(5,2,TRUE);
        gtk_container_add(GTK_CONTAINER(((struct fenetre_ajout *)data)->pVBox),((struct fenetre_ajout *)data)->tableau); 
     
        /*Insertion formulaire*/
            /*titre*/
     
            ((struct fenetre_ajout *)data)->titre=gtk_label_new("Titre"); 
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau),((struct fenetre_ajout *)data)->titre,0, 1,0, 1,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0); 
            ((struct fenetre_ajout *)data)->form_ajout0=gtk_entry_new();
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau),((struct fenetre_ajout *)data)->form_ajout0,1, 2,0, 1,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
     
            /*auteur*/
     
            ((struct fenetre_ajout *)data)->auteur=gtk_label_new("Auteur");
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->auteur,0, 1,1,2,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);   
            ((struct fenetre_ajout *)data)->form_ajout1=gtk_entry_new();
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->form_ajout1,1,2,1,2,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
            /*date*/
     
            ((struct fenetre_ajout *)data)->date=gtk_label_new("Date de publication");   
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->date,0, 1,2,3,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0); 
            ((struct fenetre_ajout *)data)->form_ajout2=gtk_entry_new();
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->form_ajout2,1, 2,2, 3,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
            /*ISBN*/
     
            ((struct fenetre_ajout *)data)->ISBN=gtk_label_new("ISBN");
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau), ((struct fenetre_ajout *)data)->ISBN,0, 1,3,4,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0); 
            ((struct fenetre_ajout *)data)->form_ajout3=gtk_entry_new();
            gtk_table_attach(GTK_TABLE(((struct fenetre_ajout *)data)->tableau),((struct fenetre_ajout *)data)->form_ajout3,1, 2,3,4,GTK_EXPAND | GTK_FILL, GTK_EXPAND,0, 0);
            /*bouton ajout*/
     
            ((struct fenetre_ajout *)data)->ajout=gtk_button_new_with_label("Ajouter le media");
            //gtk_table_attach(GTK_TABLE(ajout->tableau), ajout->ajout,1, 2,4, 5,GTK_EXPAND|GTK_SHRINK, GTK_EXPAND,0, 0);
            gtk_box_pack_start(GTK_BOX(((struct fenetre_ajout *)data)->pVBox), ((struct fenetre_ajout *)data)->ajout, TRUE, FALSE, 0);
            g_signal_connect(((struct fenetre_ajout *)data)->ajout, "button-press-event", (GCallback) ajout_media_but, data);
            //g_signal_connect(ajout->ajout, "button-release-event", (GCallback) ajout_media_but, ajout);
     
     
        //data=ajout;
         //data = (void *)ajout;
            gtk_widget_show_all( ((struct fenetre_ajout *)data)->fenetre);
          //gtk_widget_show_all( ajout->fenetre);
    }
     
    void afficher_media_ajout(GtkWidget *fenetre,GtkWidget *selection,gpointer add){
     
    printf("%s \n",((struct fenetre_ajout *)add)->media->auteur);
    printf("%s \n",((struct fenetre_ajout *)add)->media->titre);
    printf("%s \n",((struct fenetre_ajout *)add)->media->date);
    printf("%d \n",((struct fenetre_ajout *)add)->media->isbn);
     
    }
    graph.h

    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
    #ifndef GRAPH_H
    #define GRAPH_H
    #include <gtk/gtk.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
     
    struct fenetre_ajout{
        struct Media* media;
        GtkWidget* fenetre;
        GtkWidget* pNotebook;
        GtkWidget* pVBox;
        GtkWidget* titre;
        GtkWidget* auteur;
        GtkWidget* ISBN;
        GtkWidget* date;
        GtkWidget* tableau;
        GtkWidget* ajout;
        GtkWidget *form_ajout0;
        GtkWidget *form_ajout1;
        GtkWidget *form_ajout2;
        GtkWidget *form_ajout3;
        /*char* auteur1;
        char* titre1;
        char* date1;
        int isbn1;*/
        GtkWidget* label;
    }fen_ajout;
     
    typedef struct Media{
        int type;          
        char *titre;           
        char *auteur;
        char *date;
        int isbn;
    }Med;
     
    void ajout_media_but(GtkWidget *fenetre,GtkWidget *selection,gpointer data);
    void afficher_media_ajout(GtkWidget *fenetre,GtkWidget *selection,gpointer add);
    void wind_ajout3(GtkWidget *fenetre,GtkWidget *selection,gpointer data);
    #endif

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    En mettant cela : void afficher_media_ajout(GtkWidget *fenetre,gpointer add); (donc 2 arguments ) cela marche

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

Discussions similaires

  1. GTK Callback probleme argument et structure
    Par farfouillis92 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/02/2012, 10h08
  2. Pointeurs et structures: erreur de segmentation
    Par Skize dans le forum Débuter
    Réponses: 7
    Dernier message: 07/10/2010, 08h43
  3. [structures] Erreur structure vide
    Par emi3113 dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/07/2007, 18h36
  4. Structures, erreurs de compilation
    Par koktel_dfr dans le forum C
    Réponses: 10
    Dernier message: 24/05/2007, 14h30
  5. Réponses: 20
    Dernier message: 11/07/2006, 17h11

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