CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [C] GTK probleme Callback et structur

DébutPage précedente
1
Page suivantePage suivante
Shiro777 Shiro777
MP
Niveau 1
29 mars 2015 à 00:47:07

Bonjour à tous,

J'essaye de coder actuellement un petit programme ou l'on peut cliquer sur 2 boutons.L'un permet d'ouvrir une fenetre et de remplir un petit formulaire et l'autre d'afficher sur le terminal ce qui a été tapez dans le formulaire de la 2e fenetre. 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).
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. (J'ai directement seg fault au moment où j'utilise la fonction afficher media ajout)
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

#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=malloc(sizeof(struct Media));*/ wind_aj->media->titre= "test"; wind_aj->media->auteur= "test"; wind_aj->media->date = "test"; wind_aj->media->isbn = 0; 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,G_CALLBACK(gtk_main_quit),NULL,-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(afficher_media_ajout),wind_aj);); /*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

#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));
 
 
((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){
         
     
 
 printf("valeur data : %p \n",data);
    /*creation fenetre+icone*/
	printf("1\n");
   //data=(struct fenetre_ajout*)malloc(sizeof(struct fenetre_ajout));
	printf("2\n");
	    ((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
	printf("4\n");
    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);
        gtk_main();
}
 
void afficher_media_ajout(GtkWidget *fenetre,GtkWidget *selection,gpointer add){
struct fenetre_ajout* add1=(struct fenetre_ajout*)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);
printf("%d \n",add1->media->isbn);
 
}

graph.h

#ifndef GRAPH_H
#define GRAPH_H
#include <gtk/gtk.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 
typedef 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;
 
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
Message édité le 29 mars 2015 à 00:51:11 par Shiro777
COS[A-B] COS[A-B]
MP
Niveau 10
29 mars 2015 à 13:57:51

Salut,

Il me semble que que les fonctions qui sont appelées quand on appuie sur un bouton doivent avoir un prototype du genre : void afficher_media_ajout(GtkWidget * button, gpointer add); et non pas avec 3 arguments

Shiro777 Shiro777
MP
Niveau 1
01 avril 2015 à 19:30:09

oui c'est ca merci !

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment