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 :

Afficher image sur un évènement


Sujet :

GTK+ avec C & C++

  1. #1
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut Afficher image sur un évènement
    Et re bonjour ( oui oui vous allez me voir souvent dans les prochains jours ),

    Maintenant que j'ai réussi à afficher une image au chargement de ma fenêtre, je voudrais faire en sorte qu'elle s'affiche dynamiquement.
    Je m'explique : ma fenêtre contient un menu, qui me permet de parcourir mes répertoires et de choisir un fichier ; j'en récupère ensuite le chemin.

    Je voudrais donc pouvoir afficher une image à partir de ce chemin récupéré. Or, ça 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
    void recuperer_chemin (GtkWidget *bouton, GtkWidget *file_selection)
    {
    	const gchar* chemin;
    	GtkWidget *pImage;
    	GdkPixbuf *pixbuf;
    	GError *error = NULL;
    	GtkWidget *dialog;
    	chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection) );
     
    	/* Chargement d'une image a partir d'un fichier */
     
    //		pixbuf = gdk_pixbuf_new_from_file(chemin, &error);
    //		if(!error)
    //		{
    //			GdkPixbuf *pixbuf_mini = NULL;
    //			int w = gdk_pixbuf_get_width(pixbuf);
    //			int h = gdk_pixbuf_get_height(pixbuf);
    //
    //			double W = 1200 * 0.7;
    //			double H = 600;
    //
    //			double coeff = 1;
    //
    //			if (w > h) {
    //			coeff = W / w;
    //			}
    //			else {
    //			coeff = H / h;
    //			}
    //
    //			W = w * coeff;
    //			H = h * coeff;
    //
    //			pixbuf_mini = gdk_pixbuf_scale_simple(pixbuf, W, H, GDK_INTERP_NEAREST);
    //			pImage = gtk_image_new_from_pixbuf(pixbuf_mini);
    //			gtk_box_pack_start(GTK_BOX(pVBox), pImage, FALSE, FALSE, 5);
    //		}
    //		else
    //		{
    //			g_critical(error->message);
    //		}
     
    	dialog = gtk_message_dialog_new(GTK_WINDOW(file_selection),
    	GTK_DIALOG_MODAL,
    	GTK_MESSAGE_INFO,
    	GTK_BUTTONS_OK,
    	"Vous avez choisi :\n%s", chemin);
     
    	gtk_dialog_run(GTK_DIALOG(dialog));
    	gtk_widget_destroy(dialog);
    	gtk_widget_destroy(file_selection);
    }
    J'ai laissé en commentaires la partie qui est censé m'afficher mon image et qui ne fonctionne pas. Ce qui n'est pas commenté fonctionne : si je laisse cette boite de dialogue, elle m'affiche bien "vous avez choisi : chemin" quand je clique sur valider.
    Pourquoi alors, l'image ne s'affiche-t-elle pas quand je clique sur valider ?

    Merci à vous !
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Apparemment tu affiches les codes d'erreur en console. Si ca ne marche pas tu dois avoir quelques chose. Pourrais-tu nous le donner?

  3. #3
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Ben justement, rien

    J'ai passé au débuggueur ( je suis sous Eclipse sous Linux ) et rien non plus, pas d'erreur, les variables sont bien remplies...
    J'suis en train de craquer j'essaie de trouver le pourquoi du comment depuis 13h
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    chemin contient-il le chemin complet de l'image à charger? Un g_printerr("%s\n", chemin); te permettra de vérifier ca en console.

  5. #5
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Oui la variable chemin contient le chemin absolu de l'image ( /home/blabla/xxx/.../image.png ).

    Mais comme dit plus haut, ce même bout de code pour afficher l'image fonctionne lorsque je le mets dans le main ; j'ai bien mon image affichée au lancement de mon application
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Ok, je comprends mieux alors. Tu as un problème de pointeurs. Montre-nous comment tu appelles void recuperer_chemin (GtkWidget *bouton, GtkWidget *file_selection);.
    Si tu pouvez aussi nous montrer le code avec la création du gtk_file_selection(); ca serait bien.

    Une petite remarque tout de même. Les fonctions associées à gtk_file_selection sont obsolètes. utilises de préférence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GtkWidget *         gtk_file_chooser_dialog_new         (const gchar *title,
                                                             GtkWindow *parent,
                                                             GtkFileChooserAction action,
                                                             const gchar *first_button_text,
                                                             ...);

  7. #7
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Je te montre ça demain matin, le code est au boulot, j'ai rien chez moi.
    Je suis en gtk 2.0 c'est peut-être pour ça que j'utilise des fonctions obsolètes ?
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Pour ces fonctions elles sont obsolètes aussi pour gtk 2.0. Maintenant tu peux toujours les utiliser si tu veux.
    Lorsque tu vas passer à Gtk3 il te faudra alors changer.

  9. #9
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Ok étrange, elles sont dans le cours sur gtk-2.0 pourtant

    Alors sinon pour l'appel de ma fonction et la déclaration de mon file_selection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void creer_file_selection()
    {
    	GtkWidget *selection;
     
    	selection = gtk_file_selection_new( g_locale_to_utf8( "Slectionnez une image", -1, NULL, NULL, NULL) );
    	gtk_widget_show(selection);
     
    	//On interdit l'utilisation des autres fenetres.
    	gtk_window_set_modal(GTK_WINDOW(selection), TRUE);
     
    	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(selection)->ok_button), "clicked", G_CALLBACK(recuperer_chemin), selection );
     
    	g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(selection)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), selection);
    }
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  10. #10
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    J'ai changé pour ce que tu avais indiqué, en faisant comme ceci :

    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
    void open_image()
    {
    		GtkWidget *pImage;
    		GdkPixbuf *pixbuf;
    		GError *error = NULL;
    	dialog = gtk_file_chooser_dialog_new ("Open File",
    					      GTK_WINDOW(pWindow),
    					      GTK_FILE_CHOOSER_ACTION_OPEN,
    					      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    					      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    					      NULL);
    	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
    	  {
    	    char *filename;
    	    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
    	    	/* Chargement d'une image a partir d'un fichier */
     
    	    	pixbuf = gdk_pixbuf_new_from_file(filename, &error);
    	    	if(!error)
    	    	{
    	    		GdkPixbuf *pixbuf_mini = NULL;
    	    		int w = gdk_pixbuf_get_width(pixbuf);
    	    		int h = gdk_pixbuf_get_height(pixbuf);
     
    	    		int width, height;
    	    		gtk_window_get_default_size (GTK_WINDOW(pWindow), &width, &height);
    	    		double W = width * 0.7;
    	    		double H = height;
     
    	    		double coeff = 1;
     
    	    		if (w > h) {
    	    		coeff = W / w;
    	    		}
    	    		else {
    	    		coeff = H / h;
    	    		}
     
    	    		W = w * coeff;
    	    		H = h * coeff;
     
    	    		pixbuf_mini = gdk_pixbuf_scale_simple(pixbuf, W, H, GDK_INTERP_NEAREST);
    	    		pImage = gtk_image_new_from_pixbuf(pixbuf_mini);
    	    		gtk_box_pack_start(GTK_BOX(pVBox), pImage, FALSE, FALSE, 5);
    	    	}
    	    	else
    	    	{
    	    		g_critical(error->message);
    	    	}
    	    //open_file (filename);
    	    g_free (filename);
    	  }
    	gtk_widget_destroy (dialog);
    }
    Je n'ai toujours pas l'image qui s'affiche... Je pense que le problème doit être au niveau du gtk_box_pack_start(GTK_BOX(pVBox), pImage, FALSE, FALSE, 5); sauf que je vois pas pourquoi ni comment résoudre ça...

    Pour le open_file (filename) j'ai une erreur il me dit que la fonction n'est pas déclarée.
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  11. #11
    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
    Points : 2 002
    Points
    2 002
    Par défaut
    Le problème est que tu ajoutes l'image dans le conteneur, mais tu ne l'affiches pas. Il te manque après ta ligne 44 la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gtk_widget_show (GTK_WIDGET (pImage));
    La prochaine fois essaie de mettre un exemple compilable, c'est pénible de devoir retrouver toutes les définitions de variables.

    Autre chose: Plutôt que de créer ton GtkImage et l'ajouter à ce moment là, fais le plus tôt, et ne fais que modifier l'image affichée. Autrement, si tu appelles plusieurs fois d'affilée ta fonction open_image, tu vas te retrouver avec plusieurs images les unes en dessous des autres.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  12. #12
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Désolé pour le code mais comme dit plus haut, c'est un projet de recherche, donc confidentiel, je sais pas trop ce que je peux vous montrer ou pas

    Edit : c'est bon ça fonctionne avec la création du GtkImage dans le main. Bon maintenant la sauvegarde, et la mise en forme. Il faut que je puisse afficher deux images côte à côte dans ma fenêtre
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  13. #13
    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
    Points : 2 002
    Points
    2 002
    Par défaut
    Citation Envoyé par FirePrawn Voir le message
    Désolé pour le code mais comme dit plus haut, c'est un projet de recherche, donc confidentiel, je sais pas trop ce que je peux vous montrer ou pas
    J'ai aussi bossé sur des projets de recherche, et c'est le fonctionnel, la partie algorithmique qui est importante. Là tu ne nous montres que du code basique de création d'IHM en GTK, je t'assure qu'il n'y a rien de palpitant là dedans, alors on est encore loin de la divulgation d'un secret industriel.

    De plus, projet de recherche ne signifie pas forcément "confidentiel". Ce qui est important, c'est la licence sous laquelle est distribué ton code. Je te conseille de te rapprocher de tes responsables hiérarchiques pour éclaircir ce point.

    Citation Envoyé par FirePrawn Voir le message
    Donc si je te suis bien, j'affiche une image vide, et je ne fais que la modifier par la suite ?
    Mais si j'ai pas de fichier image vide, comment faire ?
    Lis la doc de GtkImage, et notamment gtk_image_new.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  14. #14
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Ta réponse et mon edit se sont croisés, j'ai trouvé tout seul sur la doc de gtk+ merci quand même

    J'aurais très certainement d'autres questions de toute façon, ne serait-ce que pour pouvoir afficher deux images côte à côte dans ma fenêtre
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

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

Discussions similaires

  1. Afficher image sur une page html via c
    Par Relyss dans le forum Réseau
    Réponses: 3
    Dernier message: 17/12/2009, 12h40
  2. Afficher image sur page jsp depuis DB
    Par c-bolo dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 14/12/2009, 18h24
  3. afficher image sur une case survolée
    Par womannosky dans le forum 2D
    Réponses: 10
    Dernier message: 22/07/2008, 21h57
  4. [css] afficher image sur div différent
    Par mussara dans le forum Mise en page CSS
    Réponses: 20
    Dernier message: 25/07/2006, 13h47
  5. Afficher image sur formulaire
    Par Pfeffer dans le forum 4D
    Réponses: 3
    Dernier message: 24/07/2006, 11h35

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