juin
2009
Bonjour,
M’étant mis à Haskell depuis quelques temps (principalement grâce au désormais fameux Real World Haskell), je me suis dis qu’il était temps que je regarde un peu du côté des bibliothèques pour interfaces utilisateurs. Hé bien, je n’ai pas été déçu. Il y a notamment Gtk2Hs qui fournit un bon binding de GTK+, compatible avec Glade (le designer) et qui permet donc de charger des interfaces depuis du XML.
Allez-y, devinez combien de lignes il a fallu ?
Initialiser le GUI, créer les widgets, … Hmm beaucoup ?
Hé bien non ! Le designer, Glade, exporte le « projet » suivant dans un XML.
XML généré :
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="title" translatable="yes">Hello, Developpez !</property>
<property name="default_width">400</property>
<property name="default_height">400</property>
<child>
<widget class="GtkButton" id="yo">
<property name="label" translatable="yes">Bonjour Developpez, comment vas-tu ?
Je suis un programme Haskell qui utilise
Gtk2Hs, binding Haskell de GTK+.
Clique pour fermer.</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
</child>
</widget>
</glade-interface>
Et voilà, l’essentiel est fait.
Voici donc le main.hs, qui est le programme Haskell dont vous avez vu un screenshot plus haut :
import Graphics.UI.Gtk -- on importe le module GTK
import Graphics.UI.Gtk.Glade -- et le module Glade, pour créer une IHM depuis le XML au format Glade
main = do
initGUI
Just xml <- xmlNew "test.glade"
window <- xmlGetWidget xml castToWindow "window1"
button <- xmlGetWidget xml castToButton "yo"
onClicked button $ do
putStrLn "Bye"
mainQuit
onDestroy window mainQuit
widgetShowAll window
mainGUI
Et voilà. Assez simple non ?
Très bonne idée.
C’est important de montrer qu’on peut aussi le faire avec un langage fonctionnel même aussi pur que Haskell, c’est évident pour nous mais ça ne l’est pas forcément pour tout le monde, certains ont des doutes à ce sujet.
Dans la même catégorie des bindings pas du tout académiques il y a un (des?) binding Haskell pour la SDL.