GTK+ en Haskell


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.

Gtk2Hs en action

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.

Designer de fenêtres de GTK+

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 :

?View Code HASKELL
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. #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. #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. #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 :)

(will not be published)
  1. No trackbacks yet.