Partage
  • Partager sur Facebook
  • Partager sur Twitter

GTK - Au-secours ! problème avec les containers

Sujet résolu
    18 février 2018 à 3:22:55

    Bonjour à vous (enfin bonne nuit, vu l'heure tardive).

    J'ai un gros problème avec GTK et les containers et malgré de nombreuses recherches, je ne m'en sors pas. Peut-être saurez-vous m'aider ?

    Je m'explique : je développe (enfin je tente de développer) une application qui contient une barre de menus puis des champs et des boutons. Lorsque je ne traite que de la fenêtre principale et du menu, ça marche et voici le code :

    #include <time.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    
    int main(int argc, char *argv[]) {
    
        GtkWidget *window;
        GtkWidget *vbox;
    
        GtkWidget *menubar;
        GtkWidget *fileMenu;
        GtkWidget *fileMi;
        GtkWidget *quitMi;
    
        gtk_init(&argc, &argv);
    
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(window), 1300, 800);
        gtk_window_set_title(GTK_WINDOW(window), "Mon application");
    
        vbox = gtk_vbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(window), vbox);
    
        menubar = gtk_menu_bar_new();
        fileMenu = gtk_menu_new();
    
        fileMi = gtk_menu_item_new_with_label("Fichier");
        quitMi = gtk_menu_item_new_with_label("Quitter");
    
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
        gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
        gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
    
        gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
    
      
      g_signal_connect(G_OBJECT(window), "destroy",
            G_CALLBACK(gtk_main_quit), NULL);
    
      g_signal_connect(G_OBJECT(quitMi), "activate",
            G_CALLBACK(gtk_main_quit), NULL);
    
      gtk_widget_show_all(window);
    
      gtk_main();
    
      return 0;
    }

    J'ai bien ma fenêtre principale avec son menu (que je ferai évouluer par la suite pour le compléter).

    Que dois-je faire pour ajouter un container qui contiendra mes boutons et mes champs de saisie (par exemple ci-dessous ça marche mais le menu lui disparaît car je suis obligé au début de faire  

        fixed = gtk_fixed_new();
        gtk_container_add(GTK_CONTAINER(window), fixed);
        btn1=gtk_fixed_new();
        btn1 = gtk_button_new_with_label("Button");
        gtk_fixed_put(GTK_FIXED(fixed), btn1, 150, 50);
        gtk_widget_set_size_request(btn1, 80, 30);
        gtk_container_add(GTK_CONTAINER(btn1), fixed);
    
        GtkWidget *pEntry;
        pEntry = gtk_entry_new();
        gtk_entry_set_max_length(pEntry,10);
        gtk_entry_set_has_frame(pEntry,1);
        gtk_box_pack_start(GTK_FIXED(fixed), pEntry, TRUE, FALSE, 0);
        gtk_fixed_put (GTK_FIXED (fixed), pEntry, 100, 100);
        gtk_widget_set_size_request(pEntry,20,30);
        gtk_container_add(GTK_CONTAINER(pEntry), fixed);
    
        GtkWidget *pEntry2;
        pEntry2 = gtk_entry_new();
        gtk_entry_set_max_length(pEntry2,10);
        gtk_entry_set_has_frame(pEntry2,1);
    //gtk_box_pack_start(GTK_BOX(vbox), pEntry2, TRUE, FALSE, 0);
        gtk_fixed_put (GTK_FIXED (fixed), pEntry2, 700, 500);
        gtk_widget_set_size_request(pEntry2,20,30);
        gtk_container_add(GTK_CONTAINER(pEntry2), fixed);

    J'avoue que je ne m'en sors pas. Je suis complètement à la ramasse. Absolument rien compris aux containers.

    Si vous aviez quelque part un petit programme qui associe menu et boutons et champs de saisie ou si vous m'expliquiez comment faire je ne serai pas l'homme le plus heureux de la Terre mais je serai ravi.

    Merci à vous.




    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2018 à 10:49:18

      Bonjour,

      Montre le code complet avec le gtkfixed pour voir comme tu le mets dans le code...

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        18 février 2018 à 13:52:10

        Bonjour. Ce dessous le code. Il suffit de changer respectivement la mise en commentaire de ces instructions en ligne 28 et 29 et en ligne 41 et 42 pour voir soit apparaître juste le menu, soit juste le bouton et les champs. Merci de ton aide...

            //gtk_container_add(GTK_CONTAINER(window), vbox);
            gtk_container_add(GTK_CONTAINER(window), fixed);

        et

          //gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
            gtk_box_pack_start(GTK_FIXED(fixed), menubar, FALSE, FALSE, 0);



        #include <time.h>
        #include <stdlib.h>
        #include <gtk/gtk.h>
        
        int main(int argc, char *argv[]) {
        
            GtkWidget *window;
            GtkWidget *vbox;
            GtkWidget *fixed;
            GtkWidget *menubar;
            GtkWidget *fileMenu;
            GtkWidget *fileMi;
            GtkWidget *quitMi;
            GtkWidget *btn1;
            GtkWidget *pEntry;
            GtkWidget *pEntry2;
        
            gtk_init(&argc, &argv);
        
            window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
            gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
            gtk_window_set_default_size(GTK_WINDOW(window), 1300, 800);
            gtk_window_set_title(GTK_WINDOW(window), "Mon application");
        
            vbox = gtk_vbox_new(FALSE, 0);
            fixed = gtk_fixed_new();
        
            //gtk_container_add(GTK_CONTAINER(window), vbox);
            gtk_container_add(GTK_CONTAINER(window), fixed);
        
            menubar = gtk_menu_bar_new();
            fileMenu = gtk_menu_new();
        
            fileMi = gtk_menu_item_new_with_label("Fichier");
            quitMi = gtk_menu_item_new_with_label("Quitter");
        
            gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
            gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
            gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
        
            //gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
            gtk_box_pack_start(GTK_FIXED(fixed), menubar, FALSE, FALSE, 0);
        
            btn1 = gtk_button_new_with_label("Button");
            gtk_fixed_put(GTK_FIXED(fixed), btn1, 150, 50);
            gtk_widget_set_size_request(btn1, 80, 30);
            gtk_container_add(GTK_CONTAINER(btn1), fixed);
        
            pEntry = gtk_entry_new();
            gtk_entry_set_max_length(pEntry,10);
            gtk_entry_set_has_frame(pEntry,1);
            gtk_box_pack_start(GTK_FIXED(fixed), pEntry, TRUE, FALSE, 0);
            gtk_fixed_put (GTK_FIXED (fixed), pEntry, 100, 100);
            gtk_widget_set_size_request(pEntry,20,30);
            gtk_container_add(GTK_CONTAINER(pEntry), fixed);
        
            pEntry2 = gtk_entry_new();
            gtk_entry_set_max_length(pEntry2,10);
            gtk_entry_set_has_frame(pEntry2,1);
            gtk_box_pack_start(GTK_FIXED(fixed), pEntry2, TRUE, FALSE, 0);
            gtk_fixed_put (GTK_FIXED (fixed), pEntry2, 700, 500);
            gtk_widget_set_size_request(pEntry2,20,30);
            gtk_container_add(GTK_CONTAINER(pEntry2), fixed);
        
            g_signal_connect(G_OBJECT(window), "destroy",
                    G_CALLBACK(gtk_main_quit), NULL);
        
            g_signal_connect(G_OBJECT(quitMi), "activate",
                    G_CALLBACK(gtk_main_quit), NULL);
        
            gtk_widget_show_all(window);
        
            gtk_main();
        
            return 0;
        }
        



        • Partager sur Facebook
        • Partager sur Twitter
          18 février 2018 à 20:25:14

          Je verrais plutôt une hiérarchie genre:

          windows

          +---vbox

          ****+----menubar

          ****+----gtkfixed?

          Sinon vois peut être https://stackoverflow.com/questions/13440308/pygtk-menubar-with-fixed

          La remarque finale sur le réel besoin d''utiliser gtkfixed se pose aussi!

          -
          Edité par breizhbugs 18 février 2018 à 20:27:45

          • Partager sur Facebook
          • Partager sur Twitter
          ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
            19 février 2018 à 4:55:05

            Merci,

            Pourquoi j'utilise gtkfixed ? Eh bien je n'en sais rien, j'ai trouvé un exemple où il était utilisé et où ça marchait. En fait je n'ai rien compris à ces containers et je n'ai rien trouvé pour m'y initier. Je suis un peu perdu. Mon souhait aurait été de tomber sur un bout de code où il y aurait eu une fenêtre principale, un menu avec des sous menus, un bouton redimensionné et placé correctement sur la fenêtre et un label saisissable. Mais si j'ai trouvé des exemples pour chaque cas, rien pour l'ensemble. Alors je tâtonne. J'essaye. Je prends des bouts de code à droite et à gauche et j'essaye de les unifier. Mais sans succès. Finalement je ne sais pas si je ne vais pas retourner à la bibliothèque graphique windows car là tout est en anglais mais en très peu de temps j'ai su créer un écran liste avec défilement, menus et sous-menus, champs de saisie et label.

            Merci à toi. Si tu connais un tutoriel sur GTK qui explique la philosophie des containers (et ce qu'est un container), je suis preneur. 

            • Partager sur Facebook
            • Partager sur Twitter
              19 février 2018 à 10:27:12

              Bonjour,

              Ne serait-il pas plus simple d'utiliser le GtkBuilder avec un fichier XML ou Glade?

              • Partager sur Facebook
              • Partager sur Twitter
                19 février 2018 à 13:15:40

                Je programme pas en gtk, mais ton problème c'est pas le fait d'utiliser un container(un container, c'est un objet qui contient d'autre composant), mais d'utiliser un layout(qui est un container particulier): un objet qui détermine comment ses enfants sont disposé graphiquement: un tuto pour python, mais qui explique quand même: https://zestedesavoir.com/tutoriels/870/des-interfaces-graphiques-en-python-et-gtk/1446_decouverte/5775_le-positionnement-grace-aux-layouts/

                http://python-gtk-3-tutorial.readthedocs.io/en/latest/layout.html

                Bien souvent ce que l'on veut n'est pas de mettre tel composant au coordonées x,y (gtkfixed) mais de placer les composants relativement les uns par rapport aux autres. Dans ce cas, le layout se charge de repositionner automatiquement tous ces "enfants" en cas de redimensionnement de la fenetre en fonction de son type.

                Pour contiunuer sur gtk, tu devrais, comme te le suggère grombindal, utiliser une EDI qui te permet de concevoir ton interface de façon visuelle.

                Perso, pour un programme fenêtré "simple", je me tournerai vers le C# + winform avec visual studio community. Il y a moyen d'avoir quelque chose de base facilement. (et c'est vachement plus accessible que win32api)

                -
                Edité par breizhbugs 19 février 2018 à 13:21:32

                • Partager sur Facebook
                • Partager sur Twitter
                ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                  19 février 2018 à 16:54:15

                  Merci  breizhbugs, merci grombindal,

                  Non, je souhaite poursuivre en C. Jusqu'à présent j'ai réussi en mode console à simuler un buffer de saisie avec déplacement par les touches Tab, à me déplacer dans un champ avec effacement caractère (comme dans un éditeur, touches directionnelles), à simuler des listes déroulantes avec rafraîchissement puis sélection (touches directionnelles), à lire et écrire dans des fichiers, etc. Je me suis ainsi fait une belle application de gestion de budget avec échéancier, contrôles, pointage, rapprochement, tri, recherche, menus simulés par touches de fonction et tralala. Bon, les puristes en C y verront sans doutes des choses pas très "convenables" mais je suis assez content de moi (je ne fais du C que depuis novembre 2017 quand mon fils a commencé ça en école d'ingé et je me suis mis au C en l'aidant algorithmiquement sur les jeux Snake et Blocus - avant il y a longtemps je programmais sur L3G (Cobol) et L4G (NSDK, Forms, SqlWindows,  PowerBuider en client serveur avant que n'arrive l'erre d'Internet), en PlSql ou SqlServer. Donc mon défi prochain est d'utiliser en codant une bibliothèque graphique et tout le monde a parlé de GTK (mais avant je m'étais lancé avec la api windows). Sachant que très bientôt mon fils va apprendre le java et que par conséquent je vais en faire de même, j'aurais aimé avant cela réussir mon petit défi : utiliser une bibliothèque graphique et voir comment bien l'utiliser.

                  Bon voilà, j'en ai dit beaucoup. Je vous remercie de vos conseils et je vais continuer à tâtonner en espérant comprendre tout ça avant de me lancer dans java et la SDL (je crois qu'ils vont utiliser SDL).

                  Bien à vous.

                  -
                  Edité par AldrikKildra 19 février 2018 à 16:56:36

                  • Partager sur Facebook
                  • Partager sur Twitter

                  GTK - Au-secours ! problème avec les containers

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown