Bonjour à tous,
est-il possible d'effectuer des calculs simple avec GTK.
Par exemple :
TAPEZ VOTRE 1er NOMBRE :
TAPEZ VOTRE 2ème NOMBRE :
VOILA L'ADDITION DE VOTRE SAISIE :
merci
Bonjour à tous,
est-il possible d'effectuer des calculs simple avec GTK.
Par exemple :
TAPEZ VOTRE 1er NOMBRE :
TAPEZ VOTRE 2ème NOMBRE :
VOILA L'ADDITION DE VOTRE SAISIE :
merci
Bin disons que c'est possible en C tout simplement.Envoyé par LE CORRE
GTK+ permet avant tout l'affichage graphiques de contrôles utilisateurs, ce que tu veux faire doit être fait sur la console ou en mode graphique ?
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Le programme se fait en mode graphique.
Je pensais à cette procédure :
Saisie des nombres par l'utilisateur en interface GTK (GTKEntry)
Calcul par le langage C
Affichage du résultat en interface GTK
Oui biensur, tu peux même le faire en une seule fenêtre, il te suffit simplement d'avoir:Envoyé par LE CORRE
- 3 GtkEntry
- 1 GtkButton
Je ne vois pas vraiment où se situe ton problème, dans les 2 premiers GtkEntry tu entres des valeurs à calculer, le GtkButton te permet de faire le calcul et le 3ème GtkEntry affiche le resultat !
Tu peux facilement convertir les chaînes contenues dans les 2 premiers GtkEntry avec la fonction standard strtol par exemple pour des entiers.
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Salut,
Dans le programme je butes sur la possibilité
1°)de valider l'enregistrement dans le GTKEntry par la touche entrée du clavier (plutot que d'avoir un bouton VALIDEZ à chaque enregistgrement)
2°) de passer d'un champs de saisie à un autre.
Sais tu comment faire?
Pour ca tu peux gérer le signal activate de ton GtkEntry !Envoyé par LE CORRE
Tu peux utiliser la fonction gtk_widget_grab_focus en lui donnant en paramètre le widget vers lequel tu veux passer le focusEnvoyé par LE CORRE
![]()
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Salut, j'ai essayé la validation de la saisie par la touche entrée ("activate")mais j'échoue.
1er nombre = pEntry1
2ème nombre = pEntry2
j'ai fait ce code
pLabel = gtk_label_new("VOTRE 1er NOMBRE");
gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
pEntry1 = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry1,TRUE, FALSE, 0);
g_signal_connect(G_OBJECT(pEntry1), "activate", G_CALLBACK( pEntry2 ), NULL);
mais ça ne fonctionne pas .
Ca fonctionnera certainement moins bien si tu met effectivement en tant que fonction callback ton pEntry2 ! Je pensais avoir était assez clair pourtant
![]()
Bon, je suis très généreux donc voici un code d'exemple qui fonctionne, pose des questions si tu ne comprend 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
53
54
55 #include <gtk/gtk.h> void cb_activate (GtkEntry * p_wid, gpointer p_data) { GtkEntry * p_entry = (GtkEntry *) p_data; g_return_if_fail (p_wid != NULL); g_return_if_fail (p_data != NULL); gtk_widget_grab_focus (GTK_WIDGET (p_entry)); } int main (int argc, char ** argv) { GtkWidget * p_win = NULL; GtkWidget * p_vbox = NULL; GtkWidget * p_entry [2]; gtk_init (& argc, & argv); p_win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (p_win), "GtkEntry..."); gtk_container_set_border_width (GTK_CONTAINER (p_win), 5); g_signal_connect ( G_OBJECT (p_win), "destroy", G_CALLBACK (gtk_main_quit), NULL ); p_vbox = gtk_vbox_new (TRUE, 5); gtk_container_add (GTK_CONTAINER (p_win), p_vbox); p_entry[0] = gtk_entry_new (); p_entry[1] = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[0], TRUE, TRUE, 5); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[1], TRUE, TRUE, 5); g_signal_connect ( G_OBJECT (p_entry[0]), "activate", G_CALLBACK (cb_activate), (GtkEntry *) p_entry[1] ); gtk_widget_show_all (p_win); gtk_main (); return 0; }
PS :![]()
![]()
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
OH LA LA?j'étais complètement dans les choux !!!
j'épluche le code dès maintenant,
encore une fois merçi
Salut,
j'ai travaillé toute la soirée sur le code mais je n'arrive pas à récupérer la chaine du GTKEntry saisie.
j'ai modifié mon code d'origine C
j'ai pourtant inclue le "strtol" comme indiqué ?
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 long resultat = 0, nombre1 = 0, nombre2 = 0; long resultat = strtol(chaine NULL 10); printf("TAPEZ VOTRE 1er NOMBRE : "); scanf("%ld", &nombre1); printf(" TAPEZ VOTRE 2ème NOMBRE :"); scanf("%ld", &nombre2); resultat = nombre1 + nombre2; printf ("%ld + %ld = %ld\n", nombre1, nombre2, resultat); system("PAUSE");
Le mieux serait que tu me donnes ton code complet et compilable pour que je puisse t'aider le mieux possible parce que là, je peut pas faire grand chose avec le peu que tu me donnes, il me faut ton vrai code !
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Salut et encore merci de ne pas me lacher.
d'un coté j'avais mon code C pour le calcul qui fonctionne bien, de l'autre j'avais mon code GTK+ d'interface qui es bon, par contre quand je fusionne les deux ça ne fonctionne pas ?
voila le code final
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 #include <stdio.h> #include <stdlib.h> #include <gtk/gtk.h> void cb_activate (GtkEntry * p_wid, gpointer p_data) { GtkEntry * p_entry = (GtkEntry *) p_data; g_return_if_fail (p_wid != NULL); g_return_if_fail (p_data != NULL); gtk_widget_grab_focus (GTK_WIDGET (p_entry)); } int main (int argc, char ** argv) { /*VARIABLES DE CALCUL*/ long resultat = 0, resultat = nombre1 + nombre2;nombre1 = 0, nombre2 = 0; long resultat = strtol(chaine NULL 10); /*VARIABLES D'ENVIRONNEMENT*/ GtkWidget * p_win = NULL; GtkWidget * p_vbox = NULL; GtkWidget * p_entry [3]; GtkWidget * p_label [3]; GtkWidget * p_button [1]; gtk_init (& argc, & argv); p_win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (p_win), "GtkEntry..."); gtk_container_set_border_width (GTK_CONTAINER (p_win), 5); g_signal_connect ( G_OBJECT (p_win), "destroy", G_CALLBACK (gtk_main_quit), NULL ); p_vbox = gtk_vbox_new (TRUE, 5); gtk_container_add (GTK_CONTAINER (p_win), p_vbox); /*MISE EN PLACE DES ELEMENTS DE LA FENETRE*/ p_entry[0] = gtk_entry_new (); p_entry[1] = gtk_entry_new (); p_entry[2] = gtk_entry_new (); p_label[0] = gtk_label_new("TAPEZ VOTRE 1er NOMBRE "); p_label[1] = gtk_label_new("TAPEZ VOTRE 2eme NOMBRE "); p_label[2] = gtk_label_new("RESULTAT DE L'ADDITION ="); p_button[0] = gtk_button_new_with_label("VALIDATION"); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[0], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[0], TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[1], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[1], TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(p_vbox), p_button[0], TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[2], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[2], TRUE, TRUE, 5); /*CALCUL DU RESULTAT*/ g_signal_connect ( G_OBJECT (p_entry[0]), "activate", G_CALLBACK (cb_activate), (GtkEntry *) p_entry[1] ); resultat = nombre1 + nombre2; gtk_widget_show_all (p_win); gtk_main (); return 0; }
Pourquoi ca fonctionne pas .... tu as fait n'importe quoi, voilà tout, il suffit pas de reprendre mot pour mot ce que j'ai fait et le mélanger avec ton code non GTK+ ... un programme ca se réfléchi, même si c'est un simple exercice de style !
Voyons ce qui ne va pas (pour faire court):
Ca veut absolument rien dire ! Ici tu déclare une variable puis je ne sais pas quel miracle tu veux faire une affectation avec deux autre variables même pas déclarées et initialisées ... il est urgent pour toi de réviser sérieusement ton C !
Code : Sélectionner tout - Visualiser dans une fenêtre à part long resultat = 0, resultat = nombre1 + nombre2;nombre1 = 0, nombre2 = 0;
Ensuite:
Ca reste plausible dans la mesure où la variable chaine existe et est initialisée, ce qui n'est nullement le cas ici !
Code : Sélectionner tout - Visualiser dans une fenêtre à part long resultat = strtol(chaine NULL 10);
Continuons ... Pour faire le calcul il faut résonner en programmation événémentielle ce qui implique que toutes les conversions ainsi que le calcul et l'affichage du résultat doit se faire par le biais d'un callback que tu aura lié à ton bouton ... sinon le bouton je n'en vois pas grand intérêt ici !
Donc si on résume, tes pointeurs sur tes widgets, mets-les à l'extérieur du main (pour le moment) pour que tu puisses y avoir accès depuis n'importe où dans ton module de compilation !
Ensuite, vu qu'on ne peut passer qu'un seul paramètre à un callback, il deviens presque naturel de créer une structure qui contiendra toutes les données numériques.
J'arrête ici car j'était déjà assez surpris par ton code... Voici le code remanié mais qui reste grandement améliorable:
Pose des questions sur ce que tu ne comprend 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
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
107
108
109
110
111
112
113
114
115 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gtk/gtk.h> /*VARIABLES D'ENVIRONNEMENT*/ GtkWidget * p_win = NULL; GtkWidget * p_vbox = NULL; GtkWidget * p_entry [3]; GtkWidget * p_label [3]; GtkWidget * p_button [1]; typedef struct { long op1; long op2; long resultat; } operandes; void cb_activate (GtkEntry * p_wid, gpointer p_data) { GtkEntry * p_entry = (GtkEntry *) p_data; g_return_if_fail (p_wid != NULL); g_return_if_fail (p_data != NULL); gtk_widget_grab_focus (GTK_WIDGET (p_entry)); } void cb_clicked (GtkButton * p_wid, gpointer p_data) { char buff [20]; operandes * op = NULL; g_return_if_fail (p_wid != NULL); g_return_if_fail (p_data != NULL); op = (operandes *) p_data; op->op1 = strtol (gtk_entry_get_text (GTK_ENTRY (p_entry[0])), NULL, 10); op->op2 = strtol (gtk_entry_get_text (GTK_ENTRY (p_entry[1])), NULL, 10); op->resultat = op->op1 + op->op2; sprintf (buff, "%ld\n", op->resultat); buff [strlen (buff) - 1] = '\0'; gtk_entry_set_text (GTK_ENTRY (p_entry[2]), buff); } int main (int argc, char ** argv) { /*VARIABLES DE CALCUL*/ operandes op; gtk_init (& argc, & argv); p_win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (p_win), "GtkEntry..."); gtk_container_set_border_width (GTK_CONTAINER (p_win), 5); g_signal_connect ( G_OBJECT (p_win), "destroy", G_CALLBACK (gtk_main_quit), NULL ); p_vbox = gtk_vbox_new (TRUE, 5); gtk_container_add (GTK_CONTAINER (p_win), p_vbox); /*MISE EN PLACE DES ELEMENTS DE LA FENETRE*/ p_entry[0] = gtk_entry_new (); p_entry[1] = gtk_entry_new (); p_entry[2] = gtk_entry_new (); p_label[0] = gtk_label_new("TAPEZ VOTRE 1er NOMBRE "); p_label[1] = gtk_label_new("TAPEZ VOTRE 2eme NOMBRE "); p_label[2] = gtk_label_new("RESULTAT DE L'ADDITION ="); p_button[0] = gtk_button_new_with_label("VALIDATION"); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[0], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[0], TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[1], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[1], TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(p_vbox), p_button[0], TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[2], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[2], TRUE, TRUE, 5); g_signal_connect ( G_OBJECT (p_button[0]), "clicked", G_CALLBACK (cb_clicked), (void *) &op ); g_signal_connect ( G_OBJECT (p_entry[0]), "activate", G_CALLBACK (cb_activate), (GtkEntry *) p_entry[1] ); gtk_widget_show_all (p_win); gtk_main (); return 0; }
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Merci pour la correction.
Et si on veut faire des calculs avec des nombres avec 2 chiffres après la virgule, est ce que strtol sera approprié à Single.
P.S ils sont pas mal tes Smileys, j'espère seulement éviter le Smiley Fouetteur pour la réponse.
Je ne sais pas où tu as cherché le type Single mais je peut t'assurer que le C c'est pas du VB, ca n'existe pasEnvoyé par LE CORRE
![]()
Pour les chiffres à virgules flottantes: strtod, strtof et strtold
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Oh la,
je prends tout de suite une feuille de papier et mon stylo qui ne possède pas l'option "copier-coller" et j'écris 100 fois ;
Je ne dois pas confondre Visual Basic et Langage C, excuse moi Franck.
Est ce que strtol sera approprié à Single., je voulais dire Double.
Bin strtod (voir les pages man)Envoyé par LE CORRE
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Bonjour,
Je comprends pas j'ai mis les changements indiqués et ça ne prend toujours pas les chiffres après la virgulle pour l'opération :
j'ai pourtant mis les strtod,double, et "%lf\n" ?
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
107
108
109
110
111
112
113
114
115
116
117 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gtk/gtk.h> /*VARIABLES D'ENVIRONNEMENT*/ GtkWidget * p_win = NULL; GtkWidget * p_vbox = NULL; GtkWidget * p_entry [3]; GtkWidget * p_label [3]; GtkWidget * p_button [1]; typedef struct { double op1; double op2; double resultat; } operandes; void cb_activate (GtkEntry * p_wid, gpointer p_data) { GtkEntry * p_entry = (GtkEntry *) p_data; g_return_if_fail (p_wid != NULL); g_return_if_fail (p_data != NULL); gtk_widget_grab_focus (GTK_WIDGET (p_entry)); } void cb_clicked (GtkButton * p_wid, gpointer p_data) { char buff [20]; operandes * op = NULL; g_return_if_fail (p_wid != NULL); g_return_if_fail (p_data != NULL); op = (operandes *) p_data; op->op1 = strtod (gtk_entry_get_text (GTK_ENTRY (p_entry[0])), NULL); op->op2 = strtod (gtk_entry_get_text (GTK_ENTRY (p_entry[1])), NULL); op->resultat = op->op1 + op->op2; sprintf (buff, "%lf\n", op->resultat); buff [strlen (buff) - 1] = '\0'; gtk_entry_set_text (GTK_ENTRY (p_entry[2]), buff); } int main (int argc, char ** argv) { /*VARIABLES DE CALCUL*/ operandes op; gtk_init (& argc, & argv); p_win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (p_win), "GtkEntry..."); gtk_container_set_border_width (GTK_CONTAINER (p_win), 5); g_signal_connect ( G_OBJECT (p_win), "destroy", G_CALLBACK (gtk_main_quit), NULL ); p_vbox = gtk_vbox_new (TRUE, 5); gtk_container_add (GTK_CONTAINER (p_win), p_vbox); /*MISE EN PLACE DES ELEMENTS DE LA FENETRE*/ p_entry[0] = gtk_entry_new (); p_entry[1] = gtk_entry_new (); p_entry[2] = gtk_entry_new (); p_label[0] = gtk_label_new("TAPEZ VOTRE 1er NOMBRE "); p_label[1] = gtk_label_new("TAPEZ VOTRE 2eme NOMBRE "); p_label[2] = gtk_label_new("RESULTAT DE L'ADDITION ="); p_button[0] = gtk_button_new_with_label("VALIDATION"); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[0], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[0], TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[1], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[1], TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(p_vbox), p_button[0], TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(p_vbox), p_label[2], TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[2], TRUE, TRUE, 5); g_signal_connect ( G_OBJECT (p_button[0]), "clicked", G_CALLBACK (cb_clicked), (void *) &op ); g_signal_connect ( G_OBJECT (p_entry[0]), "activate", G_CALLBACK (cb_activate), (GtkEntry *) p_entry[1] ); gtk_widget_show_all (p_win); gtk_main (); return 0; }
Salut,
suite à une vérification du code, j'ai modifié la ligne :
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sprintf (buff, "%lf\n", op->resultat);
et là j'obtiens le nombre avec 2 chiffres après la virgule dans le GTKEntry comme souhaité, sauf qu'il ne prend toujours pas en compte les décimaux pour le calcul ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part sprintf (buff, "%.3f", op->resultat);
Partager