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 :

problème de boutons, impossible de lancer deux fonctions en même temps


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut problème de boutons, impossible de lancer deux fonctions en même temps
    Bonjours à tous, j'ai un projet info à faire en c avec interface graphique, j'ai choisis gtk car j'ai pas mal de menus à faire, c'est un jeu de carte (le 6 qui prend),j'ai un problème, je n'arrives pas à faire en sorte que quand je clique sur un bouton, il quitte le menu en cours et en ouvre un autre sur la même fenêtre.

    voici une partie du code, je voudrais que quand je clique sur le bouton 2 (ou autre), il ferme la fonction en cours et m'en ouvre une autre
    PS: j'ai vraiment cherché partout, je n'ai rien trouvé.

    d'avance merci et bonne soirée


    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
    void menu_1(GtkWidget *pWindow)
    {
        GtkWidget *pTable;
        GtkWidget *Boutton[4];
     
     
         /* Creation et insertion de la table 7 lignes 4 colonnes */
        pTable=gtk_table_new(7,4,TRUE);
        gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pTable));
     
     
        /* Creation des boutons */
        Boutton[0]= gtk_button_new_with_label("Jouer contre l'ordinateur");
        Boutton[1]= gtk_button_new_with_label("Jouer contre un autre joueur");
        Boutton[2]= gtk_button_new_with_label("Lire les règles");
        Boutton[3]= gtk_button_new_with_label("Quitter");
     
     
        /* Insertion des boutons */
     
        gtk_table_attach_defaults(GTK_TABLE(pTable), Boutton[0],
            1, 3, 1, 2);
     
        gtk_table_attach_defaults(GTK_TABLE(pTable), Boutton[1],
            1, 3, 3, 4);
     
        gtk_table_attach_defaults(GTK_TABLE(pTable), Boutton[2],
            1, 3, 5, 6);
     
        gtk_table_attach(GTK_TABLE(pTable), Boutton[3],
            3, 4, 6, 7,
            GTK_EXPAND, GTK_EXPAND ,
            0, 0);
     
     
        g_signal_connect (Boutton[2], "clicked", regles, NULL);//je voudrais que quand je clique sur le bouton 2, je ferme cette fonction et que j'en appelle une autre
     
     
        g_signal_connect (Boutton[3], "clicked", gtk_main_quit, NULL);
     
     
     
     
     
     
     
    }
     
     
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
     
     
        gtk_init(&argc, &argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 800, 600);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Le 6 qui prend!");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
     
        menu_1(pWindow);
     
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    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 309
    Billets dans le blog
    5
    Par défaut
    Qu'entends-tu par "fermer cette fonction" ? Serait-ce plutôt fermer la fenêtre actuelle ? Si oui dans le callback "regles" tu commences par un gtk_widget_destroy(pWindow);. Il te faudra donc propager le pointeur pWindow à cette fonction callback "regles".

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Merci de répondre aussi vite en fait je voudrais que quand je clique sur le bouton 2, ça détruise le menu en cours, c'est a dire la table et les quatre boutons et que je la remplace par une autre table initialisée dans une autre fonction, un peut comme ce code qui vient de la version qui n'a pas d'interface graphique:
    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
     
    void menu_principal() { /* Fonction menu principal */
     
        int choix=0; /* Déclaration et initialisation de la variable choix pour le menu */
        printf("\n\n\t Menu principal:");
        printf("\n\n 1 - Jouer");
        printf("\n 2 - Lire les règles");
        printf("\n 3 - Quitter");
        printf("\n\n Choix: ");
        scanf("%d",&choix);
        switch (choix){
            case 1:menu_compte(); /* Appel de la fonction menu_compte */
                break;
            case 2:regles();/*appel de la fonction règle*/
                break;
            case 3:printf("\n Vous avez choisi de quitter. \n ");
                break;
     
                }
     
            }
     
     
    void menu_compte() { /* Fonction menu compte */
     
        int choix=0; /* Déclaration et initialisation de la variable choix pour le menu */
        printf("\n\n\t Menu compte:");
        printf("\n\n 1 - Créer un compte");
        printf("\n 2 - Choisir un compte existant");
        printf("\n 3 - Retour au menu principal");
        printf("\n\n Choix: ");
        scanf("%d",&choix);
        switch (choix){
            case 1:creer_compte(); /*  Appel de la fonction creer_compte */
                break;
            case 2:selectionner_compte(); /* Appel de la fonction choisir_compte et ouvre le menu joueur avec en paramètre le compte sélectionné */
                break;
            case 3:menu_principal(); /* Appel de la fonction menu_principal */
                break;
     
                }
     
            }

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    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 309
    Billets dans le blog
    5
    Par défaut
    C'est relativement simple à faire. Tu transmets à ton callback regles le pointeur pTable comme suit : g_signal_connect (Boutton[2], "clicked", regles, pTable);Ensuite, dans le callback regles il te suffit de détruire pTable avec gtk_widget_destroy(pTable);. Le prototype de regles est : void regles (GtkButton *button, GtkWidget *pTable)Une fois détruit tu peux ajouter une nouvelle table dans ta fenêtre principale et ainsi changer sa physionomie .

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    j'ai bien fait comme vous l'avez expliqué mais ça ne compile pas, il me dit:"invalid use of void expression" et "expected GCallback but argument is type void"

    voici le code du bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (Boutton[0], "clicked",regle(pWindow,pTable),pTable);
    le début du code de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void menu_2(GtkWidget *pWindow,GtkWidget *table_menu_precedent)
    {   
    gtk_widget_destroy(table_menu_precedent);
    }

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    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 309
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (Boutton[0], "clicked",regle(pWindow,pTable),pTable);
    Non ca tu ne peux pas le faire. Ensuite si c'est la fonction menu_2(); que tu veux appeler il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (Boutton[0], "clicked", G_CALLBACK(menu_2), pTable);
    Pour finir tu ne récupères pas en premier argument de menu_2(); pWindow mais le widget qui a émis le signal "clicked". C'est à dire ici le le bouton.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2012, 08h04
  2. Executer deux fonctions en même temps
    Par Invité dans le forum Threads & Processus
    Réponses: 29
    Dernier message: 06/07/2009, 16h46
  3. Impossible de lancer deux actions en même temps :/
    Par Cvbdev dans le forum Windows Forms
    Réponses: 11
    Dernier message: 08/05/2007, 14h39
  4. lancer deux fonctions en même temps
    Par youp_db dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2006, 12h11
  5. Lancer deux sons en même temps...
    Par Julien_riquelme dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/05/2003, 17h00

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