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é :
<?xml version="1.0"?> <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 :
module Main where 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 ?


#1 by Aquanum - juin 16th, 2009 at 14:40
Oh, c’est classe la gestion par xml. Enfin ça doit peut être pas être nouveau, je suis un adepte de la console pour l’instant ^^
Enfin ça semble bien propre. Mais j’ai toujours du mal à accrocher à ce langage.
#2 by Calvin1602 - juin 18th, 2009 at 01:26
Dis voir Alp, tu pourrais développer un peu sur comment Haskell gère ce genre de choses ?
J’avais lu quelques trucs sur le sujet à un moment et ce qui m’avait le plus frappé ( bien que je n’aie pas persévéré, j’avoue ) c’était qu’en Haskell si tu fais un print ma_variable suivi d’une affectation de ma_variable, c’est la valeur _finale_ de ma_variable qui sera affichée … ( enfin c’était du pseudo code, je sais pas exactement comment on fait )
Les interfaces c’est pareil, mais en gros, comment on gère les E/S ?
#3 by Alp Mestan - juillet 16th, 2009 at 17:00
Alors, effectivement, on ne *PEUT PAS* modifier des variables en Haskell.
Du coup, on utilise souvent quelque chose qui en quelque sorte évalue chacunes leur tour des « actions » (fonctions dont le type de retour est (), équivalent de unit en OCaml et void en C & C++). Mais en gros ça consiste à chaque fois à passer d’une manière ou d’une autre à tes fonctions la nouvelle valeur, et non pas la variable dont tu as modifié la valeur.
Pour les E/S, on utilise la monade I/O. Ceci devrait t’aider : http://www.haskell.org/haskellwiki/IO_inside
Par exemple, si tu lis une String dans la console, tu te retrouves avec une IO String. Si tu veux ensuite la balancer dans une autre monade (List, Maybe, etc) parce que tu en as besoin, alors tu as pas mal de choses pour ce faire. Tu peux par exemple passer une fonction d’une monade dans une autre avec fmap, etc. C’est assez déroutant au début, je te l’accorde.
Si t’as d’autres questions/remarques n’hésite pas.
PS : je te renvoie vers le haskellwiki parce que c’est bien mieux expliqué que ce que je saurais faire, et plus développé également