Les différentes étapes pour créer un widget sont :
new Gtk::Widget() pour créer un nouveau widget. Les widgets disponibles
sont tous détaillés plus loin dans cette section.
$container->add() ou $box->pack_start() .
show() pour montrer le widget.
show() permet à Gtk-Perl de savoir que nous avons définis les attributs
du widget et qu'ils sont prêts à être utilisés. Vous pouvez aussi utiliser hide()
pour le faire disparaître. L'ordre dans lequel vous faites apparaître les widgets
n'est pas important, mais je vous conseille de montrer la fenêtre en dernier
ce qui lui permet d'apparaître d'un coup plutôt que d'apparaître morceaux par
morceaux. Les enfants d'un widget ( souvenez-vous qu'une fenêtre est également
un widget ) ne seront disposés que quand leurs parents seront rendus visibles
à l'aide de la fonction show().
Pour vos références, voici l'arbre de hiérarchie de classes utilisé pour implémenter les widgets.
Gtk::Object +-Gtk::Widget | +-Gtk::Misc | | +-Gtk::Label | | | +-Gtk::AccelLabel | | | +-Gtk::TipsQuery | | +-Gtk::Arrow | | +-Gtk::Image | | +-Gtk::Pixmap | +-Gtk::Container | | +-Gtk::Bin | | | +-Gtk::Alignment | | | +-Gtk::Frame | | | | +-Gtk::AspectFrame | | | +-Gtk::Button | | | | +-Gtk::ToggleButton | | | | | +-Gtk::CheckButton | | | | | +-Gtk::RadioButton | | | | +-Gtk::OptionMenu | | | +-Gtk::Item | | | | +-Gtk::MenuItem | | | | | +-Gtk::CheckMenuItem | | | | | | +-Gtk::RadioMenuItem | | | | | +-Gtk::TearoffMenuItem | | | | +-Gtk::ListItem | | | | +-Gtk::TreeItem | | | +-Gtk::Window | | | | +-Gtk::ColorSelectionDialog | | | | +-Gtk::Dialog | | | | | +-Gtk::InputDialog | | | | +-Gtk::DrawWindow | | | | +-Gtk::FileSelection | | | | +-Gtk::FontSelectionDialog | | | | +-Gtk::Plug | | | +-Gtk::EventBox | | | +-Gtk::HandleBox | | | +-Gtk::ScrolledWindow | | | +-Gtk::Viewport | | +-Gtk::Box | | | +-Gtk::ButtonBox | | | | +-Gtk::HButtonBox | | | | +-Gtk::VButtonBox | | | +-Gtk::VBox | | | | +-Gtk::ColorSelection | | | | +-Gtk::GammaCurve | | | +-Gtk::HBox | | | +-Gtk::Combo | | | +-Gtk::Statusbar | | +-Gtk::CList | | | +-Gtk::CTree | | +-Gtk::Fixed | | +-Gtk::Notebook | | | +-Gtk::FontSelection | | +-Gtk::Paned | | | +-Gtk::HPaned | | | +-Gtk::VPaned | | +-Gtk::Layout | | +-Gtk::List | | +-Gtk::MenuShell | | | +-Gtk::MenuBar | | | +-Gtk::Menu | | +-Gtk::Packer | | +-Gtk::Socket | | +-Gtk::Table | | +-Gtk::Toolbar | | +-Gtk::Tree | +-Gtk::Calendar | +-Gtk::DrawingArea | | +-Gtk::Curve | +-Gtk::Editable | | +-Gtk::Entry | | | +-Gtk::SpinButton | | +-Gtk::Text | +-Gtk::Ruler | | +-Gtk::HRuler | | +-Gtk::VRuler | +-Gtk::Range | | +-Gtk::Scale | | | +-Gtk::HScale | | | +-Gtk::VScale | | +-Gtk::Scrollbar | | +-Gtk::HScrollbar | | +-Gtk::VScrollbar | +-Gtk::Separator | | +-Gtk::HSeparator | | +-Gtk::VSeparator | +-Gtk::Preview | +-Gtk::Progress | +-Gtk::ProgressBar +-Gtk::Data | +-Gtk::Adjustment | +-Gtk::Tooltips +-Gtk::ItemFactory
La connaissance de cette hiérarchie est très utile car elle nous indique les
fonctions disponibles pour chaque widget. Par exemple, le spinbutton
hérite de toutes les fonctions disponibles pour la classe Entry qui
hérite elle-même de la classe Editable et ainsi de suite.
Les widgets suivants n'ont pas de fenêtre associée. Si vous voulez capturer des évènements, vous devrez utilisez la `` boîte à évènements''.
Gtk::Alignment Gtk::Arrow Gtk::Bin Gtk::Box Gtk::Image Gtk::Item Gtk::Label Gtk::Pixmap Gtk::ScrolledWindow Gtk::Separator Gtk::Table Gtk::AspectFrame Gtk::Frame Gtk::VBox Gtk::HBox Gtk::VSeparator Gtk::HSeparator
Nous continuerons notre exploration de GTK en examinant chaque widget tout à tour, en créant quelques fonctions simples afin de les présenter. Une autre source d'exemples se trouve également dans les sources de Gtk-Perl.
Pour créer un widget, utilisez :
$widget = new Gtk::Widget();
Cela crée une instance de la classe widget. Noter que certains widgets peuvent
avoir plus d'une fonction new() ( comme la fonction new_with_label()
pour les boutons et les arbres ). Heureusement, comme Gtk-Perl devient plus
mature, l'usage de ces fonctions devient optionnel comme c'est déjà le cas avec
new_with_label() pour les boutons.
La destruction d'un widget s'obtient par :
$widget->destroy();
Si ce widget possède une fonction de rappel enregistrée pour le signal ``destroy'', ce retour sera appelé, ainsi on ne peut empêcher l'objet d'être détruit. Pour des informations sur les rappels, voir la section sur 'signaux et rappels''.
Les formes suivants sont plutôt simples et nous en avons déjà rencontrées sous une forme ou une autre.
$widget->show(); $widget->show_now(); $widget->show_all(); $widget->hide(); $widget->hide_all();
Noter que si un conteneur qui contient un widget n'est pas montré, alors le
widget ne sera visible que lorsque le conteneur le deviendra. Il est recommandé
que les widgets soient montrés avant leurs contenants bien que l'ordre exact
n'importe pas tant que l'on montre la fenêtre en dernier. Pour les fainéants,
la fonction show_all() montre tous les widgets et ce qu'ils contiennent.
Ce qui en pratique pour les conteneurs.
Ces fonctions vont réaliser un widget ou non :
$widget->realize();$widget->unrealize();
La réalisation est nécessaire quand vous voulez qu'un widget utilise une fenêtre
GdkWindow pour accéder à un serveur X. Normalement, la réalisation est faite
quand vous appelez la fonction show() mais parfois vous devrez appeler
la fonction realize() avant show(). En règle générale, si vous
utilisez realize(), c'est que vous voulez vous assurer que vous appréhender
correctement le problème et que c'est la meilleure manière de s'y prendre.
Les fonctions suivantes seront définies plus tard dans le chapitre ``accélérateurs clavier''.
$widget->add_accelerator( $accelerator_signal, $accelerator_group, $key, $modifiers, $accelerator_flags ); $widget->remove_accelerator( $accelerator_group, $key, $modifiers ); $widget->remove_accelerators( $accelerator_signal, $visible_only ); $widget->accelerator_signal( $accelerator_group, $key, $modifiers );
La fonction suivante enverra le signal ``activé'' à un widget :
$widget->activate();
Si un widget possède un rappel enregistré pour le signal ``activé'', ce rappel sera appelé, bien que cela ne puisse empêcher l'objet d'être détruit. Pour des informations sur les rappels, voir la section sur 'signaux et rappels''.
La fonction suivante changera les parents du widget :
$widget->reparent($new_parent);
Je ne pense pas que cette fonction vous soit utile, toujours est-il qu'elle existe si vous en avez besoin !
Gtk-Perl permet à un widget d'être celui concerné par les évènements. Par exemple, quand on a une fenêtre de dialogue avec un bouton oui et un bouton non, on peut vouloir faire en sorte que, quand on appuie sur la touche entrée, cela revient à cliquer sur le bouton oui. Pour cela il faut utiliser la fonction suivante :
$widget->grab_focus();
Un widget peut aussi se définir comme widget par défaut à l'aide des fonctions :
$widget->can_default( $default ); $widget->grab_default();
Noter que vous devrez toujours appeler can_default() avant grab_default().
L'argument de can_default() est une valeur vraie ou fausse qui détermine
si , oui ou non, le widget peut être le widget par défaut.
Un widget insensible est un widget qui ne répond pas aux appels. On peut le considérer comme inactif. Vous pouvez déclencher la sensibilité du widget en utilisant la fonction suivante :
$widget->set_sensitive( $sensitive );
L'argument ici est une valeur vraie ou fausse qui indique si le widget doit être sensible ou non. Quoi qu'il en soit, même si vous rendez un widget sensible, il sera insensible tant que ses parents le seront. Si vous souhaitez tester la sensibilité, vous pouvez utiliser :
$widget->sensitive(); $widget->is_sensitive();
Ces fonctions diffèrent en ce que la première teste seulement la valeur de sensibilité du widget alors que la seconde teste la valeur du widget, la valeur de ses parents et ainsi de suite. Seule la seconde peut vous dire si un widget est vraiment sensible ou non.
La plupart du temps, vous voudrez utiliser des conteneurs comme des boîtes et des tables pour régler la position et la taille des widgets mais il est possible de faire ces réglages à la main.
$widget->set_uposition( $x, $y ); $widget->set_usize( $width, $height );
La fonction set_uposition() règle la position du widget à $x
de la gauche et à $y pixels du haut. La fonction set_usize()
la largeur du widget à $width pixels et la hauteur à $height .
Faites attention en utilisant ces fonctions parce qu'il est facile de choisir des valeurs qui pourraient être mauvaise pour certains utilisateurs. Par exemple, un utilisateur avec des problèmes de vue pourraient choisir une grosse police par défaut pour pouvoir lire et votre bouton de 60 pixels peut s'avérer trop petit pour afficher le texte. Vous devez aussi être conscient du type de caractères et de langues qui peuvent être utilisés par vos programmes. En règle générale, laisser les conteneurs comme les boites et les tables choisir les dimensions appropriées est la meilleure solution. Toutefois, certains widgets devraient avoir leurs dimensions réglées spécifiquement. Ces widgets devraient inclure les fenêtres, les arbres, les listes, les zones de dessin et autres...
Les fonctions suivantes seront détaillées dans le chapitre sur le style.
$widget->set_style( $style ); $widget->get_style(); $widget->set_default_style( $style ); $widget->get_default_style(); $widget->restore_default_style();
Les fonctions suivantes pour la manipulation des couleurs seront vues plus tard dans le chapitre sur les couleurs.
$widget->set_colormap( $colormap ); $widget->get_colormap(); $widget->set_default_colormap( $colormap ); $widget->get_default_colormap();