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 :

utilisation d'un gtk_editable


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Par défaut utilisation d'un gtk_editable
    Bonsoir,
    J'essai de construire une calculatrice avec gtk, j'ai donc créé les boutons avec les différents chiffres,
    mais je ne sais pas comment faire afficher le chiffre sélectionné par clic de souris.
    Mon idée de départ était d'insérer un gtk_editable dans ma fenêtre et de récupérer le chiffre cliqué et de l'insérer dans l'éditable. Mais là j'ai un problème j'ai essayé de faire cela dans la fonction callback attachée aux boutons mais je n'y parviens pas, faute de pouvoir accéder à l'éditable.
    Merci pour votre aide.

    zk

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tu n'es pas le premier à vouloir faire une calculatrice avec Gtk+ (serait-ce un TP? ). Fais quelques recherches sur www.developpez.com avec le mot calculatrice, je suis sûr que tu trouveras ton bonheur.
    J'ai trouvé déjà ce post pour commencer...

  3. #3
    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
    Par défaut
    Au moment de connecter le signal "clicked" de ton bouton, passe en paramètre de g_signal_connect ton contrôle éditable en tant que paramètre "data". Tu pourras ensuite l'utiliser dans ta callback, c'est le pointeur "gpointer data" que tu as souvent comme dernier paramètre des callbacks.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Par défaut j'ai suivi vos conseils mais problème ....
    Bonsoir,
    Voilà, j'ai plutôt opté pour le label mais j'ai un gros problème à l'exécution.
    Plutôt deux, un problème d'affichage mais surtout un Abandon du programme.
    Je vous poste une version light de mon programme , ma méthode n'est sûrement pas académique donc merci de me conseiller si vraiment je m'y prends très mal.

    Voilà le code :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    struct _Affichage {
    char * texte ;
    GtkWidget * label ;
    };
    typedef struct _Affichage * Affichage ;
     
    gboolean CallBackEgal (GtkWidget * Bouton, gchar * texte)
    {
    		return TRUE ;
    }
     
    gboolean CallBackOp (GtkWidget * Bouton , Affichage a)
    {
    	gchar ** t ;
    	gtk_label_get (GTK_LABEL(a->label),t) ;
    	strcat (*t, a->texte) ;
    	gtk_label_set_text (GTK_LABEL(a->label),*t) ; 
    	return TRUE ;
    }
     
    int main(int argc, char ** argv)
    {
    char * Car [] = {"1", "2", "3", "4", "5", "6", "7", "8", "9","0", ",", "(", ")", "/","+","*","-", "EXE", "Quit"} ;
    int T [19][4] = {{1,2,1,2},{2,3,1,2},{3,4,1,2},{1,2,2,3},{2,3,2,3},{3,4,2,3},{1,2,3,4},{2,3,3,4},{3,4,3,4} \
    ,{5,6,1,2},{6,7,1,2},{5,6,2,3},{6,7,2,3},{7,8,2,3},{5,6,3,4},{6,7,3,4},{7,8,3,4},{9,11,0,1},{9,11,1,2}} ;
    gint i ;
    Affichage a = malloc (sizeof (struct _Affichage)) ;
    GtkWidget * Fenetre ;
    GtkWidget * Table ;
    GtkWidget * Bouton ;
     
    /* initialiation des bibliothèque */
    gtk_init (&argc, &argv) ;
     
    /* la fenetre principale */
    Fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL) ;
    gtk_window_set_title (GTK_WINDOW (Fenetre), "Calculatrice 4 opérations") ;
    gtk_widget_set_usize (Fenetre, 300, 200) ;
    gtk_window_set_position (GTK_WINDOW (Fenetre), GTK_WIN_POS_CENTER) ;
    /* création et attachement de la table à la fenêtre principale*/
    Table = gtk_table_new (5,11,TRUE) ;
    gtk_container_add (GTK_CONTAINER (Fenetre), Table) ;
     
    /* Création et attachement du gtklabe */
    a -> label = gtk_label_new (":") ;
    a -> texte = malloc (2*sizeof(char)) ;
    gtk_table_attach_defaults (GTK_TABLE (Table), a->label, 0,11,4,5) ;
     
    /* les boutons : création et connection callback et attachement à la table */
    for (i=0; i<19; i++) {
    Bouton = gtk_button_new_with_label (Car [i]) ;
    if (i<17) {
    a -> texte [0] = Car [i][0] ;
    a -> texte [1] = '\0' ;
    gtk_signal_connect (GTK_OBJECT (Bouton), "clicked", (GtkSignalFunc) CallBackOp, a) ;
    }
    else if (i==17) gtk_signal_connect (GTK_OBJECT (Bouton), "clicked", (GtkSignalFunc) CallBackEgal, (gpointer) Car [i]) ;
    gtk_table_attach_defaults (GTK_TABLE (Table), Bouton, T [i][0],T [i][1],T [i][2],T [i][3]) ;
    }
     
    /* destruction de la fenêtre avec le bouton quit */
    gtk_signal_connect_object (GTK_OBJECT (Bouton), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (Fenetre)) ;
    gtk_signal_connect (GTK_OBJECT (Fenetre), "destroy", (GtkSignalFunc) gtk_exit, NULL) ;
    /* on affiche le tout */
    gtk_widget_show_all (Fenetre) ;
     
    /* La boucle principale */
    gtk_main ();
    return 0 ;
    }

    A l'exécution il n'y a que des "-" qui s'affichent dans mon label, mais ensuite au bout d'une dizaine de clics sur les boutons le programme est stoppé: Abandon, voici ce qui
    s'affiche dans ma console.

    ======= Backtrace: =========
    /lib/i686/cmov/libc.so.6[0xb70bd764]
    /lib/i686/cmov/libc.so.6(cfree+0x96)[0xb70bf966]
    /usr/lib/libglib-2.0.so.0(g_free+0x36)[0xb71eb446]
    /usr/lib/libgtk-x11-2.0.so.0[0xb75731a9]
    /usr/lib/libgtk-x11-2.0.so.0[0xb757325c]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_label_set_text+0xb0)[0xb75759d0]
    ./calc[0x8048e35]
    /usr/lib/libgobject-2.0.so.0(g_cclosure_marshal_VOID__VOID+0x84)[0xb7280064]
    /usr/lib/libgobject-2.0.so.0(g_closure_invoke+0x1ab)[0xb727290b]
    /usr/lib/libgobject-2.0.so.0[0xb7285e6d]
    /usr/lib/libgobject-2.0.so.0(g_signal_emit_valist+0x7fe)[0xb728739e]
    /usr/lib/libgobject-2.0.so.0(g_signal_emit+0x26)[0xb72877e6]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_button_clicked+0x8a)[0xb74aee5a]
    /usr/lib/libgtk-x11-2.0.so.0[0xb74b0018]
    /usr/lib/libgobject-2.0.so.0(g_cclosure_marshal_VOID__VOID+0x84)[0xb7280064]
    /usr/lib/libgobject-2.0.so.0[0xb7271089]
    /usr/lib/libgobject-2.0.so.0(g_closure_invoke+0x1ab)[0xb727290b]
    /usr/lib/libgobject-2.0.so.0[0xb72856c6]
    /usr/lib/libgobject-2.0.so.0(g_signal_emit_valist+0x7fe)[0xb728739e]
    /usr/lib/libgobject-2.0.so.0(g_signal_emit+0x26)[0xb72877e6]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_button_released+0x8a)[0xb74aeefa]
    /usr/lib/libgtk-x11-2.0.so.0[0xb74aef33]
    /usr/lib/libgtk-x11-2.0.so.0[0xb758e816]
    /usr/lib/libgobject-2.0.so.0[0xb7271089]
    /usr/lib/libgobject-2.0.so.0(g_closure_invoke+0x1ab)[0xb727290b]
    /usr/lib/libgobject-2.0.so.0[0xb7285b15]
    /usr/lib/libgobject-2.0.so.0(g_signal_emit_valist+0x688)[0xb7287228]
    /usr/lib/libgobject-2.0.so.0(g_signal_emit+0x26)[0xb72877e6]
    /usr/lib/libgtk-x11-2.0.so.0[0xb76b744e]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_propagate_event+0xec)[0xb758747c]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_main_do_event+0x2df)[0xb758875f]
    /usr/lib/libgdk-x11-2.0.so.0[0xb73f96ca]
    /usr/lib/libglib-2.0.so.0(g_main_context_dispatch+0x1e8)[0xb71e31d8]
    /usr/lib/libglib-2.0.so.0[0xb71e6873]
    /usr/lib/libglib-2.0.so.0(g_main_loop_run+0x1d2)[0xb71e6d92]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_main+0xb9)[0xb7588c99]
    ./calc[0x8049275]
    /lib/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7065455]
    ./calc[0x8048d11]
    ======= Memory map: ========
    08048000-0804b000 r-xp 00000000 03:0d 1073379 /home/zk/PROGRAMMATION/GTK/Calculatrice/calc
    0804b000-0804c000 rw-p 00002000 03:0d 1073379 /home/zk/PROGRAMMATION/GTK/Calculatrice/calc
    08eee000-0903e000 rw-p 08eee000 00:00 0 [heap]
    b6800000-b6821000 rw-p b6800000 00:00 0
    b6821000-b6900000 ---p b6821000 00:00 0
    b691e000-b692a000 r-xp 00000000 03:08 78315 /lib/libgcc_s.so.1
    b692a000-b692b000 rw-p 0000b000 03:08 78315 /lib/libgcc_s.so.1
    b693b000-b6a40000 rw-p b693b000 00:00 0
    b6a40000-b6ad5000 r--p 00000000 03:09 258194 /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
    b6ad5000-b6ad7000 r-xp 00000000 03:09 146178 /usr/lib/pango/1.6.0/modules/pango-basic-fc.so
    b6ad7000-b6ad8000 rw-p 00001000 03:09 146178 /usr/lib/pango/1.6.0/modules/pango-basic-fc.so
    b6ad8000-b6ade000 r--s 00000000 03:0a 153209 /var/cache/fontconfig/945677eb7aeaf62f1d50efc3fb3ec7d8-x86.cache-2
    b6ade000-b6afc000 r--p 00000000 03:09 228841 /usr/share/locale/fr/LC_MESSAGES/libc.mo
    b6afc000-b6b23000 r-xp 00000000 03:09 154555 /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so
    b6b23000-b6b24000 rw-p 00027000 03:09 154555 /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so
    b6b24000-b6b49000 r--p 00000000 03:09 230182 /usr/share/locale/fr/LC_MESSAGES/gtk20-properties.mo
    b6b49000-b6b53000 r-xp 00000000 03:08 82644 /lib/i686/cmov/libnss_files-2.7.so
    b6b53000-b6b55000 rw-p 00009000 03:08 82644 /lib/i686/cmov/libnss_files-2.7.so
    b6b55000-b6b5d000 r-xp 00000000 03:08 82647 /lib/i686/cmov/libnss_nis-2.7.so
    b6b5d000-b6b5f000 rw-p 00008000 03:08 82647 /lib/i686/cmov/libnss_nis-2.7.so
    b6b5f000-b6b74000 r-xp 00000000 03:08 82637 /lib/i686/cmov/libnsl-2.7.so
    b6b74000-b6b76000 rw-p 00014000 03:08 82637 /lib/i686/cmov/libnsl-2.7.so
    b6b76000-b6b78000 rw-p b6b76000 00:00 0
    b6b78000-b6b7f000Abandon
    Merci pour votre aide
    rk

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je n'ai pas trop trituré ton code mais voila comment récupérer la touche enfoncée et l'affecter à un label :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gboolean CallBackOp (GtkWidget * Bouton , Affichage a)
    {
    	gchar *t = NULL;
    //	gtk_label_get (GTK_LABEL(a->label),t) ;
    t = g_strdup_printf("%s%s", gtk_label_get_text (GTK_LABEL(a->label)), gtk_button_get_label(GTK_BUTTON(Bouton)));
    //	strcat (*t, a->texte) ;
    	gtk_label_set_text (GTK_LABEL(a->label),t) ;
    	g_free(t);
    	return TRUE ;
    }

  6. #6
    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
    Par défaut
    Citation Envoyé par zerimbak Voir le message
    Bonsoir,
    Voilà, j'ai plutôt opté pour le label mais j'ai un gros problème à l'exécution.
    Plutôt deux, un problème d'affichage mais surtout un Abandon du programme.
    Je vous poste une version light de mon programme , ma méthode n'est sûrement pas académique donc merci de me conseiller si vraiment je m'y prends très mal.
    Un premier conseil: compile avec l' option -Wall si tu utilises GCC, pour avoir un maximum de warnings et détecter les erreurs dans ton code à la compilation plutôt qu'à l'exécution.

    Tu ne nous dis pas sur quelle version de GTK+ tu développes, c'est une information très importante. La documentation de référence (dernière version stable) est celle ci: http://library.gnome.org/devel/gtk/stable/

    A cause de cela, tu te retrouves à utiliser des fonctions dépréciées, ce qui n'est pas une bonne idée. Par exemple les fonctions les fonctions g_signal_* (héritées de GObject) devraient être utilisées à la place de gtk_signal_* (héritées de GtkObject). De même, comme l'indique la documentation, tu ne devrais pas utiliser gtk_label_get mais gtk_label_get_text. Pour être sûr de ne pas utiliser de fonction dépréciée, compile avec les options -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED.

    Ensuite, dans ta structure Affichage: ton champ char * texte devrait être juste un char text, car tu n'y stockes qu'un seul caractère, et donc pas besoin de rajouter un caractère de fin de chaîne.

    Je n'ai pas la possibilité de compiler ton code, mais tu peux tenter de parsemer g_debug (G_STRLOC) dans ton code pour voir où tu passes et donc voir où tu crashes. La solution la plus simple reste néanmoins d'utiliser un débogueur. Si tu es sous Linux, je te recommande Nemiver.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Par défaut Modifier l'aspect d'un label
    Bonsoir, et merci pour vos précieux conseils,
    J'ai donc réussi à faire marcher ma calculette avec un label dans lequel s'affiche les nombres et les résultats
    des calculs.
    Je souhaite savoir si c'est possible de changer l'aspect du label, car en fait le Widget Label n'a aucun contour, mais est-il possible de lui en faire un avec une couleur de fond ? Ou alors faut-il l'insérer dans un autre widget qui serait inséré dans ma table ?

    merci
    zk

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Oui tu peux utiliser un GtkEntry pour lequel tu auras désactiver la saisie avec la fonction gtk_editable_set_editable();.

  9. #9
    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
    Par défaut
    Les calculatrices utilisent en général un GtkEntry, ne serait-ce que pour pouvoir faire un copier/coller du résultat... Et là tu auras ton contours.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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