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 :

Comment actualiser le contenu d'une fenêtre mère


Sujet :

GTK+

  1. #1
    Invité
    Invité(e)
    Par défaut Comment actualiser le contenu d'une fenêtre mère
    Bonsoir tout le monde,

    Je viens vous poser une question dans l'espoir de trouver une réponse, car je ne comprends pas du tout les tutoriels concernant cette partie de GTK .

    Mon problème est le suivant, j'ai réussi à faire une interface graphique sous forme d'un calendrier. Chaque jour est associé à un bouton, et à une image paint que j'ai créé. Je click sur un jour, puis là s'ouvre une fenêtre avec 7 boutons ( ajouter modifier supprimer RDV et MEMO , et afficher et confirmer les RDV). Derrière ça j'ai réussi à associer au bouton RDV par exemple la création d'un fichier texte à partir des informations que je saisis.

    Sauf que pour qu'on sache si il y a un rendez vous, dans mon main, je choisis soit des images bleues si il y a un RDV, soit verte si il y a un mémo ,soit verte et bleue si il y a les deux, et blanche sinon.

    Tout ce dont je viens de parler jusqu'à maintenant fonctionne. Mais le hic arrive: pour voir l'affichage des RDV il faut que je relance le programme pour que dans le main, je réassocie les images après avoir cherché si les fichiers txt existaient.

    Ma question est donc, comment puis-je faire un rafraichissement automatique ? J'avais pensé à passer en paramètre la fenêtre mère, mais j'ai deux fenêtre filles , donc je ne sais pas comment faire, et puis même si je le faisais à la première fenêtre, je ne saurais pas non plus comment faire puisque je ne comprends pas comment fonctionne le dernier paramètre de G signal connect.

    Les choses que je dois pouvoir refaire tourner pour régénérer l'affichage sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void associeBoutonImage(int jour,int dernierJour,GtkWidget *pImage[28]);
    void insertImageBouton(GtkWidget *pButton[28],GtkWidget *pImage[28]);

    J'espère avoir été assez clair, merci d'avance !

    Bobi.

  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
    La réponse est relativement simple. Encore faut-il le savoir.

    Si tu veux effectuer une tâche régulièrement et automatiquement il faut que cette tâche fasse partie de la boucle principale de Gtk+. Pour se faire il existe quatre fonctions, selon tes besoin, dont :

    Grâce à elles tu indiques une fonction CallBack qui sera exécutée selon la période que tu auras choisi. Cette période n'est pas garantie. Mais pour tes besoins ça fonctionnera très bien.
    Dans ta fonction CallBack tu pourras tester si un RDV existe et mettre ainsi à jour la couleur du bouton correspondant.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    La réponse est relativement simple. Encore faut-il le savoir.

    Si tu veux effectuer une tâche régulièrement et automatiquement il faut que cette tâche fasse partie de la boucle principale de Gtk+. Pour se faire il existe quatre fonctions, selon tes besoin, dont :

    Grâce à elles tu indiques une fonction CallBack qui sera exécutée selon la période que tu auras choisi. Cette période n'est pas garantie. Mais pour tes besoins ça fonctionnera très bien.
    Dans ta fonction CallBack tu pourras tester si un RDV existe et mettre ainsi à jour la couleur du bouton correspondant.

    Tout d'abord, merci beaucoup pour votre réponse ! Je pense que cette fonction est idéale, mais après avoir essayé de la mettre en route, j'ai des messages d'erreurs que je ne comprends pas .

    J'ai mis dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add_seconds(4,associeBoutonImage(jour,mois.Dernier_jour,mere->pImage),mere->pImage);
    associeBoutonImage est la fonction que j'ai cité précédemment, jour représente le numéro du jour d'aujourd'hui, le second paramètre comme son nom l'indique, le dernier jour du mois, et mere représente la structure de ma fenêtre mère, avec mere->pImage qui représente le tableau de 28 images que j'associe à mes 28 boutons .

    Les erreurs que j'ai obtenu sont :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur	1	error C2095: 'g_timeout_add_seconds'*: le paramètre réel a 'void' comme type*: paramètre 2	c:\users\j.maurice\desktop\projet algo\projet gtk+\projet gtk+\main.c	184	projet gtk+
    Erreur	4	error C2198: 'g_timeout_add_seconds'*: pas assez d'arguments pour un appel	c:\users\j.maurice\desktop\projet algo\projet gtk+\projet gtk+\main.c	184	projet gtk+
    J'ai essayé de changer en mettant juste le nom de la fonction sans les paramètres, mais vu que j'ai besoin d'y mettre la structure mere->pImage, je vois pas comment elle les modifierais sans les arguments .

    En tout cas merci beaucoup !

  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
    Ces fonctions demandent de transmettre un pointeur sur une fonction avec un prototype particulier. Ce prototype est un GSourceFunc ().
    En partant de là tu ne peux transmettre à ce type de fonctions qu'un pointeur comme données utilisateur. Cette donnée utilisateur correspond au dernier argument des fonctions d'appel citées dans mon premier post.
    A partir de là tu te rends compte qu'il va falloir que tu organises tes données autrement si tu veux pouvoir les transmettre. Le meilleur moyen est de les regrouper dans une structure. Il ne te reste alors qu'à transmettre un pointeur sur une variable du type de ta structure pour récupérer tout ce petit monde.

    Voila un exemple rapide pour t'aider à saisir le principe:
    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
     
    typedef struct
    {
      int jour;
      int mois;
      GdkPixbuf *image;
    } SGlobalData;
     
    gboolean callback_func (gpointer user_data)
    {
      /* On récupère en transtypant la variable transmise */
      SGlobalData * = (SGlobalData*) user_data;
     
     /* A partir d'ici on fait le traitement que l'on veut. */
     
      return FALSE;
    }
     
    int main (int argc, char *argv[])
    {
      SGlobalData data;
     
      /* Je n'écris pas ici tout le code pour créer et exécuter une fenêtre Gtk+. */
      /* Ce n'est pas le but de l'exemple. */
      /* Je n'écris que la connexion du callback exécuté toutes les secondes */
      /* pour comprendre comment on connecte tout ce petit monde. */
      g_timeout_add_seconds(1, (GSourceFunc)callback_func, &data);
      return 0;
    }
    Voila, en espérant être clair...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour votre réponse, j'ai essayé , et voila ce que ça m'a donné:

    J'ai mis dans mon int main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     g_timeout_add_seconds(4,(GSourceFunc)rafraichissement,mere);
    J'ai mis dans le fichier main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    gboolean rafraichissement (gpointer user_data)
    {
     
    	int jour=date();
    	Mois mois;
      Mere* mere= user_data;
     
      init_mois(&mois);
      associeBoutonImage(jour,mois.Dernier_jour,mere->pImage);
     
     
     
      return FALSE;
    }
    Dans mon fichier.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean rafraichissement (gpointer user_data);
    Et voila les erreurs qu'il me met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur	121	error LNK2001: symbole externe non résolu _g_timeout_add_seconds	main.obj	projet gtk+
    Erreur	122	fatal error LNK1120: 1 externes non résolus	C:\Users\J.MAURICE\Desktop\projet algo\projet gtk+\Debug\projet gtk+.exe	projet gtk+
    Si je commente le code que j'ai rajouté, cela fonctionne, donc je ne sais pas ce qui pose problème dans ce que j'ai rajouté

  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
    Je suppose que Mere est un pointeur sur une structure. Lors du stranstypage il faut donner explicitement le format de la donnée reçue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mere* mere= (Mere*)user_data;
    Dans la fonction suivante j'espère que mere est un pointeur, et pas une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add_seconds(4,(GSourceFunc)rafraichissement,mere);

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je suppose que Mere est un pointeur sur une structure. Lors du stranstypage il faut donner explicitement le format de la donnée reçue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mere* mere= (Mere*)user_data;
    Dans la fonction suivante j'espère que mere est un pointeur, et pas une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add_seconds(4,(GSourceFunc)rafraichissement,mere);
    Merci pour votre réponse rapide.
    Voici ma structure :

    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
    //Structure fenêtre mere
    typedef struct 
    {
    	GtkWidget *pWindow;
        GtkWidget *pVBox;
    	GtkWidget *pHBox;
    	GtkWidget *pHBox2;
    	GtkWidget *pHBox3;
    	GtkWidget *pHBox4;
    	GtkWidget *pHBox5;
        GtkWidget *pMenuBar;
    	GtkItemFactory *pItemFactory;
        GtkAccelGroup *pAccel;
    	GtkWidget *pButton[28];
    	GtkWidget *pImage[28];
    	GtkWidget *pBanniere;
     
    }Mere;
    Le début de mon main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc, char **argv)
    {
    Mere* mere;
     
     
    etc...
     
    g_timeout_add_seconds(4,(GSourceFunc)rafraichissement,mere);// fonction qui remet à jour l'affichage toutes les 4 secondes 
    gtk_widget_show_all(mere->pWindow);
     
        gtk_main();
     
        return 0;
    }

    J'ai fais la modification dont vous m'avez parler:
    dans le fichier 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
     
     
    gboolean rafraichissement (gpointer user_data)
    {
      /* On récupère en transtypant la variable transmise */
    	int jour=date();
    	Mois mois;
    	Mere* mere= (Mere*)user_data;
     
    	init_mois(&mois);
    	/* A partir d'ici on fait le traitement que l'on veut. */
    	associeBoutonImage(jour,mois.Dernier_jour,mere->pImage);
     
     
     
      return FALSE;
    }

    Voici les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur	121	error LNK2019: symbole externe non résolu _g_timeout_add_seconds référencé dans la fonction _main	main.obj	projet gtk+
    Erreur	122	fatal error LNK1120: 1 externes non résolus	C:\Users\J.MAURICE\Desktop\projet algo\projet gtk+\Debug\projet gtk+.exe	projet gtk+

    Je ne comprends plus trop

  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
    Citation Envoyé par bobi42 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur	121	error LNK2019: symbole externe non résolu _g_timeout_add_seconds référencé dans la fonction _main	main.obj	projet gtk+
    Erreur	122	fatal error LNK1120: 1 externes non résolus	C:\Users\J.MAURICE\Desktop\projet algo\projet gtk+\Debug\projet gtk+.exe	projet gtk+
    Ca ressemblerai à une erreur à la compilation. Un problème pour gérer les liens entre tes différents fichiers source. La fonction rafraichissement(); est dans un autre fichier ?

    Si oui vérifies les options à la compilation. Je t'avoue que je ne travaille pas sous Windows, donc si le problème vient de là je ne vais peut être pas pouvoir t'aider plus.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Ca ressemblerai à une erreur à la compilation. Un problème pour gérer les liens entre tes différents fichiers source. La fonction rafraichissement(); est dans un autre fichier ?

    Si oui vérifies les options à la compilation. Je t'avoue que je ne travaille pas sous Windows, donc si le problème vient de là je ne vais peut être pas pouvoir t'aider plus.
    Non à aucun moment je ne pose une fonction qui s'appelle rafraichissement, mais j'ai remarqué que si à la place de mettre "Mere* mere= (Mere*)user_data;", je met "Mere* mere= (mere*)user_data;" ça me dit juste qu'il y a un problème de parenthèses mais sans me dire qu'il y a un problème de lien, je ne sais pas si cela signifie quelque chose, mais si c'était un problème de lien entre fichiers, en faisant cette erreur ça devrait me le remettre encore .

    Je sais pas trop quoi conclure avec ça

  10. #10
    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
    Si tu commentes la fonction g_timeout_add_seconds(); as-tu encore le warning?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Si tu commentes la fonction g_timeout_add_seconds(); as-tu encore le warning?
    Non, mon programme se lance normalement

  12. #12
    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
    Tu travailles avec quelle version de Gtk+?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Oula ! alors là je ne sais pas du tout puisque je suis allé voir un tuto qui expliquais très bien comment l'installer.

    C'est le seul moyen que j'ai trouvé pour installer GTK et que ça fonctionne à vrai dire
    Dernière modification par Domi2 ; 20/02/2012 à 13h03. Motif: Lien externe]

  14. #14
    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
    Bon. Si tu as une version < 2.14 la fonction g_timeout_add_seconds(); n'existe pas!
    Utilises plutôt g_timeout_add();. Elle sera compatible avec ton installation et nous permettra d'éliminer le problème probable d'incompatibilité de version.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Bon. Si tu as une version < 2.14 la fonction g_timeout_add_seconds(); n'existe pas!
    Utilises plutôt g_timeout_add();. Elle sera compatible avec ton installation et nous permettra d'éliminer le problème probable d'incompatibilité de version.
    Merci encore pour votre aide, j'ai réessayé, cela a fonctionné si je met un rendez -vous, mais j'ai l'impression qu'elle ne le fait pas à chaque fois :S De plus, quand je met un mémo, normalement l'image passe verte, mais là elle ne le fait pas, alors je ne comprends pas pourquoi

    Ca a bien marché , mais ça marche quand ça veut en fait


    EDIT: je viens de changer le return FALSE en return TRUE et du coup elle se met bien à jour !

    De plus j'avais fais la bêtise de ne pas utiliser ma fonction AssocieBoutonImage qui associais l'image que je venais de changer au bouton, ce qui veut dire que soit dit en passant ce que je faisais ne servais à rien !
    Dernière modification par Invité ; 19/02/2012 à 22h35.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/05/2011, 10h36
  2. Comment copier le contenu d'une fenêtre dos
    Par Tragan dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 24/12/2009, 16h13
  3. Réponses: 8
    Dernier message: 16/08/2008, 21h38
  4. [C#] Imprimer le contenu d'une fenêtre avec ascenseur
    Par biglong dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/08/2007, 23h29
  5. Comment effacer le contenu d'une scrollbox???
    Par Leclair2000 dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2004, 16h34

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