2014/06/25

Gtk2hsを使ったHaskellのGUIプログラミング(Linux Mint)

Gtk2hsを使って, HaskellでGUIプログラミングした時のメモ.
Linux Mint上でのインストールから, WindowとDialogの表示と
イベントドリブンでの状態の持たせ方, 参考リンク等.

apt-getでのインストールは,


sudo apt-get install libghc-gtk-dev


で, Graphics.UI.Gtkが使えるようになります.

最初のシンプルなWindow表示は, Gtk2hs Tutorialにあるので, ボタンを押してダイアログボックスを表示させる例を書きます.


以下のように実行します.

ghc showWindow.hs
./showWindow


dialogは, インスタンスを作成して(messageDialogNew), 実行して(dialogRun), インスタンス(widgetDestroy)を消去するという流れです. windowのインスタンスの参照は, Maybeモナドで包む必要があります.
 MessageInfoのところには, MessageType型の情報を指定します. MessageWarning, MessageQuestion, MessageError, MessageOtherなどが指定でき, ダイアログの右側に表示されるアイコンを変更可能.
  ButtonsOkのところは, ButtonsType型の情報を表し, ButtonsNone, ButtonsOk, ButtonsClose, ButtonsCancel, ButtonsYesNo, ButtonsOkCancelなどが指定できます.

イベントドリブンでの状態
 Gtk2Hsでは, イベントドリブンによるプログラミングを行うようなので, Haskellとは相性が悪そうな, いわゆる状態をもたせる必要があります. ググってみると, 次のような記事が出てきました.

How to pass state between event handlers in gtk2hs (Stack Over Flow)

 Haskellにおいて, 状態を持たせそうな仕組みは, 並列プログラミングにおけるMVar, Reader/Writerモナド, Stateモナド等, いろいろありますし, 上記の記事ではMVarを薦めていますが,  一番口当たりがいいのは, IORefオブジェクトだと思われます.
 IORefは, 参照によるオブジェクトの共有を行う仕組みで, Clojureのref, OCamlの破壊的代入と基本的に使い方は同じです. IOモナド中に普通に記述できます.



readIORef, writeIORef, newIORefでイベントハンドラ上で状態を共有することができます.

参考文献

Gtkに関しては, C言語の記事が多いので, C言語関係のコードを読みながら, Haskellへ読み替えられる場合があります.こことか.

Gtk2hs関連のページは,
Gtk2hs Tutorial
HackageのGtk2hsのソース
が参考になりました.

0 件のコメント :