Bonjour,
Je souhaiterais savoir comment éxectuter un callback au lancement du programme ou de la fenêtre.
Bonjour,
Je souhaiterais savoir comment éxectuter un callback au lancement du programme ou de la fenêtre.
Trop vague comme question. Ce CALLBACK, il est normalement appelé avec quel signal?
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
Exactement, c'est le signal et le widget que je cherche.
J'ai essayé sur la fenêtre principale avec le signal focus mais ça ne marche pas.
Mettre la fonction directement ça marche mais le problème c'est que je ne peux plus accéder à d'autres fonctions.
Je me rappelle jamais, tu as des évènements expose, map et realize sur les GtkWidgets, un de ceux là (je dirais expose) doit correspondre à ce que tu veux. Il y a aussi show, mais je pense que c'est émis en réponse à un gtk_widget_show.
Ca me rend fou. les "events" fonctionnent mais trop tôt apparemment. Avec "expose" la liste n'est pas encore chargé du coup quand j'essaie d'exploiter son contenu j'ai des caractères spéciaux au lieu d'une chaine de caractère. Je précise que lorsque j'utilise un bouton pour démarrer mes taches ça fonctionne parfaitement.
Donc ma question, comment faire pour que le callback soit éxecuter après que tout soit chargé (j'ai essayé g_signal_connect_after() mais ça ne marche pas non plus)?
Je n'ai aucune idée de quelle façon tu charges "tout", ni de ce que "tout" peut être, donc je ne peux pas t'aider.
Je parle de l'interface, il faudrai que le callback se connecte seulement après que toute l'interface soit chargée.
Voilà mon callback:
et voila la fonction appelée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part g_signal_connect(G_OBJECT(mainWindow), "expose-event", G_CALLBACK(Ouverture), &tab);
J'espère que c'est clair
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void Ouverture(GtkWidget *pWidget, gpointer datas) { Datas *n = (Datas *)datas; //"Datas" est un struct n->num_fichier = 0; //le numero de fichier par defaut, qui signifie qu'aucun fichier de la liste n'est en cours de traitement gtk_tree_model_foreach(GTK_TREE_MODEL(n->store), foreach_func, n); //parcour la liste pour récupérer quelques infos, avec expose il ne se fait pas (vérifié avec des "cout" un peu partout dans la fonction "foreach_func") n->ss_total = n->cumulTaille; //utile pour une autres fonction plus tard, le cumulTaille est incorrecte également avec expose cout << toChar(to_string(n->compteur)) << endl; //avec expose on voit que cette variable n'a pas eu d'affectation de valeur, qui ce fait dans le foreach_func (avec un bouton au lieu de l'exécution automatique ça fonctionne) gtk_label_set_label(GTK_LABEL(n->lbl_num_fichier_tot), toChar(to_string(n->compteur))); //change les label en conséquence gtk_label_set_label(GTK_LABEL(n->lbl_taille_totale), toChar(strSize(n->cumulTaille))); //idem }
Et en utilisant le signal supposé fonctionner (expose event ?) ca marche pas ?
Cela étant dit, je vois pas l'interet de foutre ca en callback ?
Il suffit d'appeller ta fonction lors de la création de la fenêtre non ?
(ou lors du gtk_show ...)
Parce que la fenêtre, y'a bien un moment (que ca soit via un callback ou directement) ou tu dois appeller son lancement ! Bah tu balance l'appel juste aprés (ou juste avant si c'est de l'initiatisation), et le tour est joué ?
(C'est peut être même pour ca que GTK ne t'autorises pas à faire ce que tu veux via une callback ?)
SAlut! je ne sais pas si tu as essayé le signal realize mais si tu ne l'as pas fait alors essaye le.
Bonne suite
Merci de vos réponses,
je ne peux pas mettre une fonction sans callback car j'ai besoin dans ma fonction de retourner dans la boucle du main avec gtk_main_iteration() car j'ai une boucle qui freeze mon interface jusqu'à la fin de son execution.
Ensuite pour le realize tu me conseil de le mettre sur quel widget ? Je l'ai essayé sur mon mainWindow mais sans succès. Peux-tu me donner un marche à suivre ?
Salut,
C'est peut être moi qui ne comprends pas un truc, mais à partir du moment ou tu sais que cette fonction ne sera appellée qu'une fois, lors de la création de ta fenêtre (de toute facon si c'est lors de la création, encore une fois, il faut bien que tu l'affiche à un moment ta fenêtre ... => bah au moment de l'afficher, tu lances ta fonction!)
Y'a aucun cas ou une callback est applicable ici d'aprés moi ...
Je crois que tu fais un bloquage alors que y'a pas à se creuser la tête.
La solution est la :
Tu es toujours dans la boucle du main ... Si t'y es plus, c'est que le programme est terminé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // Création de la fenêtre : myWindow= gtk_window_new("myWindow"); (...) // Affichage de la fenêtre : gtk_window_show_all(myWindow); // Modifications à apporter aprés l'ouverture : Ouverture(datas); // pas besoin de GtkWidget *pWidget. gtk_window_show_all(datas->page); (enfin ce que t'as changé quoi, sinon appelle Ouverture juste avant le show all ...)
Si vraiment c'est toujours pas ok, postes l'appel de fonction, ou plutot l'endroit ou tu veux coller ton signal.
Mais vraiment, je vois pas le probleme (pour l'instant en tout cas)
up ?
Je suis curieux de savoir si j'ai vraiment raté un épisode ou pas![]()
Effectivement skip tu n'a pas compris.
Dans mon programme j'ai une boucle main (normal puisqu'il y a une interface graphique) et si j'utilise ma fonction sans callback (qui avec la fonction gtk_main_iteration permet de revenir dans la boucle du main pour rafraichir l'interface) la boucle qui est dans ma fonction tourne sans revenir à aucun moment dans ma boucle main. En revanche si j'utilise un callback je peux mettre un gtk_main_iteration dans ma boucle (toujours dans ma fonction) de manière à se que je retourne dans le main pour rafraichir l'interface, sans le gtk_main_iteration la boucle de ma fonction tournerais jusqu'à être terminé et seulement à ce moment elle reviendrais dans le main, en gros sans gtk_main_iteration mon interface se fige jusqu'à ce que la boucle se termine.
Pour en revenir à mon problème, je confirme que realize sur mon mainWindow ne fonctionne pas, il ne rentre pas dans ma fonction, j'ai mis un cout << "test" << endl en début de fonction pour vérifier. Et pour map-event et expose-event ma théorie est que les callback arrive trop tôt ma liste n'a pas le temps de s'initialiser car j'ai des hexadecimaux (des adresses) au lieu de mes chaines du coup j'ai une erreur de segmentation car ma fonction n'a pas les bons paramètres.
PS: Au moins quelqu'un aura appris quelque chose avec mon post c'est déjà ça
Oki, au moins ton explication est claire
Et donc le gtk_main_iteration, t'es sur que tu peux pas le mettre dans une fonction normale, parce que sinon, il suffit de le mettre dans ta fonction classique quoi.
Et sinon, mettre un gtk_show / gtk_show_all à la place, ca marche/suffit pas?
Je ne comprends pas bien moiTu veux un callback pour exécuter un gtk_main_iteration pendant que ta fonction tourne, mais les callbacks sont justement invoqués par gtk_main_iteration, c'est à ça que sert (essentiellement) cette fonction. Et si tu as des appels à gtk_main_iteration dans ton code pour invoquer le callback, le callback en question ne sert plus à grand chose. Donc soit j'ai mal compris ce que tu veux faire, soit ce que tu veux faire se mord la queue
![]()
Dessolé de faire remonter un sujet vieux de 3 ans, mais je suis exactement dans le même problème que drazx, je veux lancer un callback automatiquement après l'ouverture et l'affichage de ma fenêtre.
Ma raison est légèrement différente, je veux récupérer la taille d'une gtk_hbox pour pouvoir gérer la taille d'un gtk_hpaned placé à l’intérieur.
Le problème est que si je demande :
-> sans callback (dans mon main)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 GtkAllocation* alloc_m_pH0; gtk_widget_get_allocation(GTK_WIDGET(pData->m_pH0),alloc_m_pH0); std::cout<<"alloc_m_pH0 (height x width) : " <<alloc_m_pH0->height <<" x "<<alloc_m_pH0->width<<std::endl; std::cout<<"alloc_m_pH0 (X x Y) : " <<alloc_m_pH0->x <<" x "<<alloc_m_pH0->y<<std::endl;
alloc_m_pH0 (height x width) : 1 x 1
alloc_m_pH0 (X x Y) : -1 x -1
-> avec un callback automatique :
alloc_m_pH0 (height x width) : 565 x 1179
Code : Sélectionner tout - Visualiser dans une fenêtre à part g_signal_connect(G_OBJECT(m_pWindow),"show",G_CALLBACK(Callback_Test),(gpointer*) &struc_gtk_principale);
alloc_m_pH0 (X x Y) : 0 x 25
Dommage ce ne sont pas les bonnes taille !!!
-> sur un callback attaché à un bouton :
alloc_m_pH0 (height x width) : 730 x 1130
Code : Sélectionner tout - Visualiser dans une fenêtre à part g_signal_connect(G_OBJECT(pButton),"clicked",G_CALLBACK(Callback_Test),(gpointer*) &struc_gtk_principale);
alloc_m_pH0 (X x Y) : 0 x 25
Dimension OK !!!
Auriez vous une idée pour résoudre ce problème ???
Partager