Linux でも wxHaskell


Ubuntu Linux でも wxHaskell が動作したのでメモしておきます。
wxWidgets ライブラリを apt-get コマンドでインストールしての cabal install wx はコンパイルに失敗。 WxHaskell/Building を参考にソースからインストールしました。

  • wxWidgets のインストール。(Current Stable Release: 2.8.11 wxGTK)
> wget http://prdownloads.sourceforge.net/wxwindows/wxGTK-2.8.11.tar.gz
> tar zxf wxGTK-2.8.11.tar.gz
> cd wxGTK-2.8.11
> mkdir mybuild
> cd mybuild
> ../configure --enable-unicode
> make
> sudo make install
> cd contrib/src
> make
> sudo make install
> cd ../../samples/controls
> make         # controls が作成されるので実行してみる。
> ./controls
  • wxHaskell のビルド
> cabal update
> cabal install wx

これで wxHaskell がインストールされました。

- ghc -package wx -o test test.hs
- UTF8
module Main where

import Graphics.UI.WX
import Graphics.UI.WXCore 

main :: IO ()
main = start gui

gui :: IO ()
gui = do 
    form    <- frame [text := "コントロール"]
    p       <- panel form []
    textlog <- textCtrl p [enabled := True, wrap := WrapNone] 
    textCtrlMakeLogActiveTarget textlog
    logMessage "ログの記録を開始します。"              

    ok   <- button p [text := "OK", on command := appendText textlog "OKボタンが押されました。\n"]
    quit <- button p [text := "終了", on command := close form]
    let rlabels = ["第一", "第二", "第三"]
    radioBox       <- radioBox p Horizontal rlabels [text := "横並び", on select ::= logSelect]
    disableButton  <- button   p [text := "無効", on command ::= onEnable radioBox]

    set form [layout :=
                container p $
                 column 0
                     [( margin 10 $  row 7 [widget radioBox ,
                                            widget disableButton ,widget ok, widget quit])
                 , hfill $ minsize (sz 400 150) $ widget textlog ]
             , clientSize := sz 400 200 ]
    return ()

        where
            logSelect w = do
                i <- get w selection
                s <- get w (item i)
                logMessage ("selected index: " ++ show i ++ ": " ++ s)

            onEnable w b = do 
                set w [enabled :~ not]
                enable <- get w enabled
                set b [text := (if enable then "無効" else "有効")]

Windows で動作したソースwxHaskell を使ってみる(2)がそのまま動作しました。