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 :

suite d'une calculette


Sujet :

GTK+ avec C & C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut suite d'une calculette
    Bonjour,

    aidez moi, j'ai une calculatrice à réaliser pour mi mai et je ne vois pas comment continuer : je vous donne déjà ce que j'ai fait :

    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
     
    #include <gtk/gtk.h>
     #include <stdlib.h>
    void on_activate_entry(GtkWidget *entreesaisi, gpointer data);
    int main(int argc, char **argv)
    {
       GtkWidget *mafenetre;
       GtkWidget *boxv;
       GtkWidget *saisi;
       GtkWidget *matable;
       GtkWidget *monlabel;
       GtkWidget *bouton[17];
     
    gtk_init(&argc,&argv);
     
       mafenetre= gtk_window_new(GTK_WINDOW_TOPLEVEL);
       gtk_window_set_title(GTK_WINDOW(mafenetre),"Calculatrice");
       gtk_window_set_default_size(GTK_WINDOW(mafenetre),700,600);
       g_signal_connect(G_OBJECT(mafenetre),"destroy",G_CALLBACK(gtk_main_quit),NULL);
     
       matable=gtk_table_new(7,4,TRUE); 
       gtk_container_add(GTK_CONTAINER(mafenetre),GTK_WIDGET(matable));
     
       saisi = gtk_entry_new();
     
       bouton[0]=gtk_button_new_with_label("0");
       bouton[1]=gtk_button_new_with_label(",");
       bouton[2]=gtk_button_new_with_label("-");
       bouton[3]=gtk_button_new_with_label("1");
       bouton[4]=gtk_button_new_with_label("2");
       bouton[5]=gtk_button_new_with_label("3");
       bouton[6]=gtk_button_new_with_label("4");
       bouton[7]=gtk_button_new_with_label("5");
       bouton[8]=gtk_button_new_with_label("6");
       bouton[9]=gtk_button_new_with_label("7");
       bouton[10]=gtk_button_new_with_label("8");
       bouton[11]=gtk_button_new_with_label("9");
       bouton[12]=gtk_button_new_with_label("=");
       bouton[13]=gtk_button_new_with_label("+");
       bouton[14]=gtk_button_new_with_label("-");
       bouton[15]=gtk_button_new_with_label("*");
       bouton[16]=gtk_button_new_with_label("/");
     
       monlabel = gtk_label_new(NULL); 
     
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[0],0,1,6,7);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[1],1,2,6,7);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[2],2,3,6,7);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[3],0,1,5,6);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[4],1,2,5,6);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[5],2,3,5,6);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[6],0,1,4,5);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[7],1,2,4,5);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[8],2,3,4,5);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[9],0,1,3,4);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[10],1,2,3,4);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[11],2,3,3,4);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[12],3,4,6,7);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[13],3,4,5,6);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[14],3,4,4,5);
       gtk_table_attach_defaults(GTK_TABLE(matable),bouton[15],3,4,3,4);
     
       gtk_widget_show_all(mafenetre);
       gtk_main();
       return EXIT_SUCCESS;
    }
    maintenant je souhaite pouvoir afficher un widget qui fait apparaitre ce que l'on tape ( donc si je clique sur 2 puis sur le + puis 3 je veux que sa m'affich 2 + 3) j'ai déja vu le cours de gtk + qui permet de faire le tuto assez célèbre qui consiste à copier une chaine de caractère que l'on a écrit auparavant. Mais le problème c'est que je n'arrive pas à faire le rapport avec mon sujet, ya til des fonctions qui sont faites pour sa? plz donner moi ce petit bout de code !

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    commence dabord par trouver une place a ton label dans la table comme tu a fait avec les boutons en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gtk_table_attach_defaults(GTK_TABLE(matable),monlabel,x,x,x,x);
    ensuite connecte tous tes bouton a la seule et meme fonction callback (chacun tout seul ) qui metteras a jour monlabel en concaténant le label du bouton avec !

    n'oublie pas de passer monlabel en parametre a la fonction callback !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(bouton[x]), "clicked", G_CALLBACK(cb_tafonction), monlabel);
    voila j'esper que ca peut t'aider

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut
    Je ne vois pas vraiment ce que tu veux en dire en disant que monlabel soit concaténé avec le label du bouton :s

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Citation Envoyé par icpajacky Voir le message
    Je ne vois pas vraiment ce que tu veux en dire en disant que monlabel soit concaténé avec le label du bouton :s
    pour ton exemple (2+3) voila ce qui deverait se passer normalement :

    tu vas ajouter le label de bouton[4] qui est "2" a la fin de monbalel qui est egal initialement a la chaine vide "" (concaténer "ch1" et "ch2" c'est ajouter ch2 a la fin de ch1 ce qui va donner "ch1ch2")

    par la suite quand tu appuis sur bouton[13] c'est un petit peut la meme chose qui va se reproduire : tu va ajouter "+" a la fin de monlabel qui contient maintenant "2" et ainsi de suite !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut
    Je te remercie de m'aider sur cette calculette
    Regarde j'ai essayé de faire la fonction du 0 mais il y a un problèm dans la fonction, quand je compile et j'exécute sa me met le message "envoyer le rapport d'erreur ou ne pas l'envoyer " ( je sais que sa viens d'elle car quand je supprime ce qu'il ya entre accolade, sa ne m'affice pas d'erreur ). Est ce que c'est comme sa que tu voyais ta fonction avec le label?? (je te met le code jusqu'au bouton approprié, après j'ai plus rien touché).
    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
     
    void fonctionlabel(GtkWidget *monlabel,GtkWidget *boxprincipal,GtkWidget *zonetexte,GtkWidget *mafenetre,gpointer data)
    {
    monlabel = gtk_label_new("0");
    gtk_label_get_label(GTK_LABEL(monlabel));
    gtk_container_add (GTK_CONTAINER(zonetexte),monlabel);
    gtk_widget_show_all(mafenetre);
    }
    int main (int argc, char **argv)
    {
    GtkWidget *mafenetre ;
    GtkWidget *boxprincipal ;
    GtkWidget *matable;
    GtkWidget *bouton[17];
    GtkWidget *monlabel;
     
    // Initialisation de GTK+ //
    gtk_init (&argc, &argv);
     
    // Creation de la fenetre principale de notre application //
    mafenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (G_OBJECT (mafenetre), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
    // Creation du conteneur principal //
    boxprincipal = gtk_vbox_new (FALSE, 20);
     
    gtk_container_add (GTK_CONTAINER (mafenetre), boxprincipal);
     
    GtkWidget *zonetexte = NULL;
     
    //Creation de la zone de texte //
    zonetexte = gtk_text_view_new ();
    gtk_box_pack_start (GTK_BOX (boxprincipal), zonetexte, TRUE, TRUE, 0);
     
    matable=gtk_table_new(7,4,TRUE);
    gtk_container_add(GTK_CONTAINER(boxprincipal),GTK_WIDGET(matable));
     
    bouton[0]=gtk_button_new_with_label("0");
    bouton[1]=gtk_button_new_with_label(",");
    bouton[2]=gtk_button_new_with_label("-");
    bouton[3]=gtk_button_new_with_label("1");
    bouton[4]=gtk_button_new_with_label("2");
    bouton[5]=gtk_button_new_with_label("3");
    bouton[6]=gtk_button_new_with_label("4");
    bouton[7]=gtk_button_new_with_label("5");
    bouton[8]=gtk_button_new_with_label("6");
    bouton[9]=gtk_button_new_with_label("7");
    bouton[10]=gtk_button_new_with_label("8");
    bouton[11]=gtk_button_new_with_label("9");
    bouton[12]=gtk_button_new_with_label("=");
    bouton[13]=gtk_button_new_with_label("+");
    bouton[14]=gtk_button_new_with_label("-");
    bouton[15]=gtk_button_new_with_label("*");
    bouton[16]=gtk_button_new_with_label("/");
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[0],0,1,6,7);
     
    g_signal_connect(G_OBJECT(bouton[0]), "clicked", G_CALLBACK(fonctionlabel), monlabel);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[1],1,2,6,7);

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut
    excuse moi mais je ne vois vraiment pas comment m'y prendre pour pouvoir concaténer les deux labels. Je sais que sa ne le fais pas trop quand on demande la réponse mais un exemple serait le bienvenue. Faut comprendre que je débute le GTK donc toutes ces manipulations ne sont guère encore maîtrisées ^^

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Le prototype de ta fonction callback est plus qu'étrange... Tu ne peux passer qu'un argument utilisateur à une fonction callback.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    tu dois normalement bien lire la doc avant de passer a ton tp ! de cette maniere tu ne risque pas d'avancer .. et surtout n'attend pas qu'on fasse le boulot a ta place ! je suis bloqué depuis 2 jours et personne ne prend la peine de me repondre sur ce forum

    en ce qui conserne ta calculette voila la solution a ton probleme :
    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
    118
    119
    120
    121
    #include <gtk/gtk.h>
    #include <stdlib.h>
    #define max 30
     
    void cb_update_entry(GtkWidget *pBtn, gpointer entry)
    {
         gchar stext[max];// normalement je devai allouer la memoire dynamiquement mais pour faire simple .. 
     
         // if faut recuperer le text de l'Entry (saisi) avec gtk_entry_get_text();
         // puis formater la chaine stext avec le text recuperé
         g_sprintf(stext,"%s",gtk_entry_get_text(GTK_ENTRY(entry)));
         // remarque que j'appele une fonction a l'interieure d'une autre 
     
         // 1 - recuperer le label du bouton 
         // 2 - ajouter ce label a la fin de stext (comme expliqué en haut ) 
         strcat(stext,gtk_button_get_label(GTK_BUTTON(pBtn)));
     
         // cette fonction met a jour le text de ton entry 
         gtk_entry_set_text(GTK_ENTRY(entry), stext);
     
    }
    int main(int argc, char **argv)
    {
    GtkWidget *mafenetre;
    GtkWidget *boxv;
    GtkWidget *saisi;
    GtkWidget *matable;
    GtkWidget *monlabel;
    GtkWidget *bouton[17];
     
    gtk_init(&argc,&argv);
     
    mafenetre= gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(mafenetre),"Calculatrice");
    gtk_window_set_default_size(GTK_WINDOW(mafenetre),700,600);
    g_signal_connect(G_OBJECT(mafenetre),"destroy",G_CALLBACK(gtk_main_quit),NULL);
     
    matable=gtk_table_new(7,4,TRUE);
    gtk_container_add(GTK_CONTAINER(mafenetre),GTK_WIDGET(matable));
     
    //saisi = gtk_entry_new();
    saisi = gtk_entry_new_with_max_length(max);
    // jette un pti coup d'oeil au #define 
     
    bouton[0]=gtk_button_new_with_label("0");
    bouton[1]=gtk_button_new_with_label(",");
    bouton[2]=gtk_button_new_with_label("-");
    bouton[3]=gtk_button_new_with_label("1");
    bouton[4]=gtk_button_new_with_label("2");
    bouton[5]=gtk_button_new_with_label("3");
    bouton[6]=gtk_button_new_with_label("4");
    bouton[7]=gtk_button_new_with_label("5");
    bouton[8]=gtk_button_new_with_label("6");
    bouton[9]=gtk_button_new_with_label("7");
    bouton[10]=gtk_button_new_with_label("8");
    bouton[11]=gtk_button_new_with_label("9");
    bouton[12]=gtk_button_new_with_label("=");
    bouton[13]=gtk_button_new_with_label("+");
    bouton[14]=gtk_button_new_with_label("-");
    bouton[15]=gtk_button_new_with_label("*");
    bouton[16]=gtk_button_new_with_label("/");
     
    //tu ne fait rien avec mon label donc tu peut t'en passer 
    monlabel = gtk_label_new(NULL);
     
    // il fallait atacher ton entry 'saisi' a la bable pour qu'il s'affiche 
    gtk_table_attach_defaults(GTK_TABLE(matable),saisi,1,3,1,2);
     
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[0],0,1,6,7);
    g_signal_connect(G_OBJECT(bouton[0]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[1],1,2,6,7);
    g_signal_connect(G_OBJECT(bouton[1]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[2],2,3,6,7);
    g_signal_connect(G_OBJECT(bouton[2]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[3],0,1,5,6);
    g_signal_connect(G_OBJECT(bouton[3]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[4],1,2,5,6);
    g_signal_connect(G_OBJECT(bouton[4]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[5],2,3,5,6);
    g_signal_connect(G_OBJECT(bouton[5]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[6],0,1,4,5);
    g_signal_connect(G_OBJECT(bouton[6]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[7],1,2,4,5);
    g_signal_connect(G_OBJECT(bouton[7]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[8],2,3,4,5);
    g_signal_connect(G_OBJECT(bouton[8]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[9],0,1,3,4);
    g_signal_connect(G_OBJECT(bouton[9]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[10],1,2,3,4);
    g_signal_connect(G_OBJECT(bouton[10]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[11],2,3,3,4);
    g_signal_connect(G_OBJECT(bouton[11]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[12],3,4,6,7);
    g_signal_connect(G_OBJECT(bouton[12]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[13],3,4,5,6);
    g_signal_connect(G_OBJECT(bouton[13]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[14],3,4,4,5);
    g_signal_connect(G_OBJECT(bouton[14]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_table_attach_defaults(GTK_TABLE(matable),bouton[15],3,4,3,4);
    g_signal_connect(G_OBJECT(bouton[15]), "clicked", G_CALLBACK(cb_update_entry),(GtkWidget*)saisi);
     
    gtk_widget_show_all(mafenetre);
    gtk_main();
    return EXIT_SUCCESS;
    }
    bonne continuation mon pote

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    g_strdup_printf et g_strconcat se chargent des allocations mémoires à ta place (j'ai vu que t'avais un g_sprintf et un commentaire au sujet des allocations dynamiques).

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    @titeuf : oue merci pour la remarque ! ces fameuses fonctions de la glib qui facilitent la vie quand on a affaire aux chaines de caracteres ! c'est juste que je ne suis pas encore familiarisé avec ! donc je prefere utiliser celles dont je suis sur .

    @icpajaky : enfait le bouton '=' doit etre connecté a une autre fonction qui , dans le cas ou l'expression est correcte , va l'evaluer et afficher son resultat.
    Maintenant que tu as un exemple je crois que tu es capable de faire ca tout seul

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/11/2006, 11h14
  2. [VBA-E] Comment écrire à la suite dans une cellule ?
    Par bogosse dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/07/2006, 13h03
  3. Problème pour une calculette
    Par Pyrhaa_666 dans le forum C
    Réponses: 5
    Dernier message: 13/07/2006, 19h47
  4. Réponses: 2
    Dernier message: 08/12/2005, 05h28
  5. [Struts] Fermer un Pop up à la suite d'une action
    Par Sniper37 dans le forum Struts 1
    Réponses: 2
    Dernier message: 10/03/2005, 13h58

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