logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 27-12-2019 17:07:17

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

C, gtk3 et les frames

Bonjour a tous,

J'essaie de céer deux boites entourée de frames mais cote à cote.
J'ai essayé de le faire avec "grid", sans résultat.

Y a quelque chose que je e comprends pas dans les emboilement de widgets dans gtk..

Ce code:


void activate (GtkApplication *app, gpointer user_data)
{
  GtkWidget *window;
  GtkWidget *frame;
  GtkWidget *sep;
  GtkWidget *label;
  GtkWidget *box;

  window = gtk_application_window_new(app);
  gtk_window_set_title (GTK_WINDOW (window),"Machin");
  gtk_container_set_border_width (GTK_CONTAINER  ( window), 10);
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  frame = gtk_frame_new("L'hiver");
  gtk_container_add (GTK_CONTAINER (window), frame);
  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
  gtk_box_pack_start(GTK_BOX (box), frame, FALSE, FALSE, 5);
 
  frame = gtk_frame_new("L'été");
  gtk_container_add (GTK_CONTAINER (window), frame);
  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
  gtk_box_pack_start(GTK_BOX (box), frame, TRUE, TRUE, 5);

  sep = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add ( GTK_CONTAINER (window), sep);

  label = gtk_label_new ("Printemps");
  gtk_container_add (GTK_CONTAINER (window), label);

  gtk_widget_show_all(window);
}

 


Ce code me donne ça:
1577465494.png

Je n'arrive pas a comprendre comment emboiter correctement une "frame" avec des elements comme les boutons ou les labels.


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#2 27-12-2019 21:44:40

lann
Membre
Lieu : Bretagne
Distrib. : Debian Bookworm
Noyau : Linux 6.1.0-10-amd64
(G)UI : XFCE
Inscription : 28-04-2015

Re : C, gtk3 et les frames

J'essaierai avec deux box différentes : box1 et box2

Hors ligne

#3 28-12-2019 16:15:27

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : C, gtk3 et les frames

J'ai essayé avec deux box, toujours le même résultat.

Par contre j'ai utilisé l'outil grid et la j'arrrive a mettre mes deux frames cote à cote mais cça me parait incontrolable. J'arrive a ça :


GtkWidget *window;
  GtkWidget *frame;
  GtkWidget *sep;
  GtkWidget *label;
  GtkWidget *grid;
 
  window = gtk_application_window_new(app);
  gtk_window_set_title (GTK_WINDOW (window),"Machin");
  gtk_container_set_border_width (GTK_CONTAINER  ( window), 10);
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  grid = gtk_grid_new();
  gtk_container_add (GTK_CONTAINER (window), grid);


  frame = gtk_frame_new("L'hiver");
  gtk_container_add (GTK_CONTAINER (window), frame);
  gtk_grid_attach (GTK_GRID (grid), frame, 0,0,4,4);

  frame = gtk_frame_new("L'été");
  gtk_container_add (GTK_CONTAINER (window), frame);
  gtk_grid_attach (GTK_GRID (grid), frame, 4,0,4,4);

 



https://pasteboard.co/INmdi8b.png

Je perd les contours des frames.
La je suis a cours d'idée hmm

Ps : en jouant avec les grids j'arrive a un truc qui ca dans le sens de ce que je cherche.


  frame = gtk_frame_new("L'hiver");
  gtk_container_add (GTK_CONTAINER (window), frame);
  gtk_grid_attach (GTK_GRID (grid), frame, 0,0,16,16);

  frame = gtk_frame_new("L'été");
  gtk_container_add (GTK_CONTAINER (window), frame);
  gtk_grid_attach (GTK_GRID (grid), frame, 32,0,64,64);

 



https://pasteboard.co/INmkN3P.png

Dernière modification par Clem (28-12-2019 16:33:03)


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#4 28-12-2019 17:31:08

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : C, gtk3 et les frames


grid = gtk_grid_new();
  gtk_container_add (GTK_CONTAINER (window), grid);


  frame = gtk_frame_new("L'hiver");
  gtk_container_add (GTK_CONTAINER (window), frame);
  gtk_grid_attach (GTK_GRID (grid), frame, 0,0,128,128);

  frame = gtk_frame_new("L'été");
  gtk_container_add (GTK_CONTAINER (window), frame);
  gtk_grid_attach (GTK_GRID (grid), frame, 128,0,32,32);
 
  gtk_widget_set_vexpand (frame, TRUE);
  gtk_widget_set_hexpand (frame, TRUE);

 

Gotcha!

J'ai bien mes deux frames cote a cote mais celle de droite reste coincé dans la rangée de droite.
Ca avance ... Ca avance..


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#5 28-12-2019 21:16:16

lann
Membre
Lieu : Bretagne
Distrib. : Debian Bookworm
Noyau : Linux 6.1.0-10-amd64
(G)UI : XFCE
Inscription : 28-04-2015

Re : C, gtk3 et les frames

Ce code fonctionne bien chez moi (adapté de l'exemple gtkmm). C'est en C++ mais tu peux l'adapter au C, je pense

example_window.h

#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:

  //Child widgets:
  Gtk::Frame m_Frame1, m_Frame2;
  Gtk::HBox hbox;
};

#endif //GTKMM_EXAMPLEWINDOW_H



main.cpp

#include "example_window.h"
#include <gtkmm/application.h>

int main(int argc, char *argv[])
{
  auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  ExampleWindow window;

  //Shows the window and returns when it is closed.
  return app->run(window);
}



example_window.cpp

#include "example_window.h"

ExampleWindow::ExampleWindow()
{
 /* Set some window properties */
  set_title("Frame Example");
  set_size_request(300, 300);

  /* Sets the border width of the window. */
  set_border_width(10);

  add(hbox);
  hbox.pack_start(m_Frame1);
  hbox.pack_start(m_Frame2);

  /* Set the frames label */
  m_Frame1.set_label("Gtk::Frame Widget1");
  m_Frame2.set_label("Gtk::Frame Widget2");

  /* Align the label at the right of the frame */
  //m_Frame.set_label_align(Gtk::ALIGN_END, Gtk::ALIGN_START);

  /* Set the style of the frame */
  m_Frame1.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
  m_Frame2.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}



Pour compiler

g++ *.cpp -o frames $(pkg-config --libs --cflags gtkmm-3.0)
 

Dernière modification par lann (28-12-2019 21:17:10)

Hors ligne

#6 29-12-2019 09:33:39

lann
Membre
Lieu : Bretagne
Distrib. : Debian Bookworm
Noyau : Linux 6.1.0-10-amd64
(G)UI : XFCE
Inscription : 28-04-2015

Re : C, gtk3 et les frames

En regardant ton code je pense que le problème vient du fait que tu ajoutes plusieurs fois le même widget à un container différent.
Tiré de la doc gtk3 :

A widget may be added to only one container at a time; you can’t place the same widget inside two different containers.



Essayes ça

void activate (GtkApplication *app, gpointer user_data)
{
  GtkWidget *window;
  GtkWidget *frame;
  GtkWidget *sep;
  GtkWidget *label;
  GtkWidget *box;

  window = gtk_application_window_new(app);
  gtk_window_set_title (GTK_WINDOW (window),"Machin");
  gtk_container_set_border_width (GTK_CONTAINER  ( window), 10);
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  frame = gtk_frame_new("L'hiver");
  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
  gtk_container_add (GTK_CONTAINER (window), box);

  gtk_box_pack_start(GTK_BOX (box), frame, FALSE, FALSE, 5);

  sep = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_box_pack_start(GTK_BOX (box), sep, FALSE, FALSE, 5);
 
  frame = gtk_frame_new("L'été");
  gtk_box_pack_start(GTK_BOX (box), frame, FALSE, FALSE, 5);

  gtk_widget_show_all(window);
}

Dernière modification par lann (29-12-2019 09:34:09)

Hors ligne

#7 29-12-2019 14:45:04

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : C, gtk3 et les frames

Merci a toi,,
Iann ton code marche comme j'en avait besoin
mais j'ai du mal à comprendre ou étais mon erreur.

Code faux:


gtk_container_add (GTK_CONTAINER (window), frame);

code juste

gtk_container_add (GTK_CONTAINER (window), box);

Pour le coup je n'ai plus de warnings a l'execution comme j'avais precedemment.
voir ( https://debian-facile.org/viewtopic.php?id=25986 ).

Dernière modification par Clem (29-12-2019 16:14:58)


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#8 29-12-2019 15:07:25

lann
Membre
Lieu : Bretagne
Distrib. : Debian Bookworm
Noyau : Linux 6.1.0-10-amd64
(G)UI : XFCE
Inscription : 28-04-2015

Re : C, gtk3 et les frames

Le principe quand tu as plusieurs Widget à afficher dans une fenêtre est de passer par les Box :
- Ajouter la Box à la fenêtre (add)
- Placer les widgets dans la Box (pack_start)

Toi tu ajoutais tout dans la fenêtre. ça ne peut pas fonctionner

Hors ligne

#9 29-12-2019 15:28:06

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : C, gtk3 et les frames

Ha d'accord,
merci beauboup yes.gif

Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#10 29-12-2019 15:32:49

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : C, gtk3 et les frames

Du coup si je veux ajouter du texte, des labels sous mes frames il va falloir qur j'emboite le label dans la boxqui est lui même emboité dans la fenetre?
PS: oui c'était ça. Je suis arrivé a ce que je voulais


frame = gtk_frame_new("L'hiver");
  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
  gtk_container_add (GTK_CONTAINER (window), box);
  gtk_box_pack_start(GTK_BOX (box), frame, FALSE, FALSE, 5);

  label = gtk_label_new ("Feuilles mortes");
  gtk_container_add ( GTK_CONTAINER (frame), label);
  gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 5);

  frame = gtk_frame_new("L'été");
  gtk_box_pack_start(GTK_BOX (box), frame, FALSE, FALSE, 5);

   sep = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_box_pack_start(GTK_BOX (box), sep, FALSE, FALSE, 5);

 

Dernière modification par Clem (29-12-2019 15:58:38)


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

#11 29-12-2019 16:01:24

Clem
Membre
Lieu : Au coin du bois
Distrib. : Stable
Noyau : 4.9.0-4 *-amd-64
(G)UI : XMonad & Mate
Inscription : 09-03-2010

Re : C, gtk3 et les frames

Par contre j'ai encore des problème d'emboitementseble-t-il...


clem@debian:~$ ./Ram/sep


(sep:28104): Gtk-CRITICAL **: 15:54:31.355: gtk_box_pack: assertion '_gtk_widget_get_parent (child) == NULL' failed

 


bloc à supprimer si la commande n’affiche rien



Voici la ligne coupable :


gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 5);
 

Dernière modification par Clem (29-12-2019 16:04:36)


Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...

Hors ligne

Pied de page des forums