Les évènements (signaux)
Lorsque nous créons un bouton, nous voudrions pouvoir dire quand l’utilisateur clique sur le bouton, afficher Bonjour. De même, nous voudrions pouvoir indiquer à la fenêtre quand l’utilisateur fermer cette fenêtre, terminer le programme. Avec GTK, cela se fait en associant une méthode à un signal (ne pas confondre avec les signaux UNIX, bien que le concept soit similaire). Chaque widget dispose d’une panoplie de signaux auquel il peut réagir. Par exemple, un bouton peut réagir au signal clicked, lorsque l’utilisateur a cliqué sur ce bouton :
button = Gtk::Button.new('Bonjour')
button.signal_connect('clicked') {
print "Bonjour tout le monde\n"
}
Nous parlions plus haut de la boucle principale du programme. Nous pouvons maintenant vous expliquer de quoi il s’agit : un programme graphique est différent d’un programme classique, car il ne possède pas un début et une fin prédéterminées. Sa tâche est d’attendre des actions de l’utilisateur. Une fois l’interface graphique construite, il faut donc se placer dans une boucle, dans laquelle le programme attend indéfiniment que des évènements se produisent, et appelle les méthodes correspondant à ces évènements. Et ce, jusqu’à ce qu’un évènement indique la fin du programme.
Voyons une version améliorée de notre premier exemple :
require 'gtk2'
Gtk.init
window = Gtk::Window.new
window.signal_connect('destroy') {
Gtk.main_quit
}
button = Gtk::Button.new('Bonjour tout le monde')
button.signal_connect('clicked') {
print "Bonjour !\n"
}
window.add(button)
window.show_all
Gtk.main
print "Terminé\n"
Dans cet exemple, nous avons connecté la méthode Gtk.main_quit au signal indiquant que l’on demande la destruction de la fenêtre. Cette méthode permet de sortir de la boucle principale, et de poursuivre le programme. Ainsi, lorsque nous fermons la fenêtre, le programme continue de s’exécuter après la ligne Gtk.main, et affiche Terminé.
Autre léger changement, nous avons remplacé les lignes :
button.show
window.show
Par un raccourcis qui rend visible un widget et tous les widgets qui sont contenus dans celui-ci, récursivement :
window.show_all
Sommaire
Précédent : IHM-GTK : Concepts de base Suivant : IHM-GTK : Les conteneurs


