wsHaskell 最初の一歩

ホーム   目次  


簡単な例

最初の例として、ウィンドウにタイトルをつけ、ウィンドウのサイズを指定し、ウィンドウの表示位置をスクリーンの中央にします。位置を指定していない場合のデフォルト位置は、スクリーンの左上になります。

 

simple.hs


module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore   -- for frameCenter

main :: IO ()
main = start gui

gui :: IO ()
gui = do
    f <- frame [text := "簡単な",
                clientSize := sz 250 150]
    frameCenter f
    

Haskell では、インデントを2スペースにする慣習があると思っていたのですが、4スペースも一般的みたいですね。ここでは4スペースにしています。インデントをタブにした場合、ghciでは警告が出て、ghcでは警告が出ないみたいです。

コード説明

最初の例なのですべての行を説明しようと思います。wxHaskellを使ってみて、コード数が少なくて済むのには驚きました。

module Main where

メインモジュールであることを宣言しています。この宣言は省略することができますが、ここでは記述しました。

import Graphics.UI.WX

Graphocs.UI.WXは、wxHaskellで最も標準的で不可欠なライブラリです。この中には、start関数やframe関数が含まれています。

import Graphics.UI.WXCore

Graphics.UI.WXCoreライブラリには、ウィンドウを中央に表示するためのframeCenter関数が含まれています。

main :: IO ()

main関数の型定義をしています。他のプログミング言語と同様にwxHaskellでも、プログラムはmain関数から始まる決まりになっています。main関数は、引数を取らず、 IO () 型を返します。

main = start gui

main関数の実際の動作を定義しています。

start 関数は、プログラムのメインループを始めます。start 関数は、IO () を返す関数を引数に取らなければなりません。

gui :: IO ()

gui関数の型定義をしています。main関数と同様に、gui関数も引数を取らず、IO ()型を返しています。

gui = do

gui関数の実際の動作の定義を始めています。doは、ご存知の通り、式が複数続くことを表します。

f <- frame [text := "簡単な",

frame関数はフレーム(ウィンドウ)を作成します。引数には、ウィンドウに関する色々な設置値のリストを取ることができます。この行ではtext属性(ウィンドウのタイトル)に「簡単な」を設定しています。そして、frameで作成したウィンドウを、変数 f に束縛しています。

clientSize := sz 250 150]

clientSize属性はウィジェットのサイズを設定します。sz関数は引数の値のサイズオブジェクトを返します。

frameCenter f

frameCenter関数は、引数で指定したフレームをスクリーンの縦横中央に表示します。そして、frameCenter関数は、IO () 型を返します。結果として、gui関数は、特に何もしなくても、IO () を返すことになります。

Linux Mintでは、位置を指定しない場合でも、ウィドウは中央に表示されます。これはwxHaskellだけでなく、Linux Mintのデフォルトです。

ボタン

次の例では、ウィンドウにボタンを表示し、そのボタンをクリックするとアプリケーションが終了するようにします。

button.hs


module Main where
import Graphics.UI.WX

main :: IO ()
main = start gui

gui :: IO ()
gui = do
    f <- frame [text := "ボタン",
                clientSize := sz 270 150]
    p <- panel f [clientSize := sz 500 500]
    b <- button p [text := "終了",
                  position := pt 20 20,
                   on command := close f]
    return ()
    

コード説明

p <- panel f [clientSize := sz 500 500]

panel ウィジェット [リスト]で、パネルを第1引数のウィジェットの中に、[リスト]の属性を持って作っています。パネルとは、レイアウトのために使うコンテナーで、目には見えません。

通常、フレームは、その中のウィジェットが一つだけの場合、そのウィジェットをフレーム全体に広げます。今回の場合、ボタンがフレーム一杯に広がってしまっては困るので、まず、パネルを配置しています。

パネルにサイズを与えているのは、少し変ですが、wxHaskellの場合、フレームに配置されたウィジェットがフレーム一杯に広がるはのは、なぜか、フレームが再描画された時からです。最初にサイズを与えておかなければ、パネルの初期値は縦横がそれぞれ0pxのままです。それでは、その中に配置しているボタンが、アプリケーションの起動時には見えなくなってしまいます。パネルに与える初期値は、この場合、フレームより大きくても構いません。フレームが再描画されてからは、パネルのサイズは、フレームのコンテントエリアと同じサイズになります。

b <- button p [text := "終了",

ボタンをパネルの中に作っています。そしてボタンに表示される文字列は「終了」です。

position := pt 20 20,

ボタンの位置を指定しています。この位置とは、ボタンが配置されたパネルの中のx座標とy座標です。

on command := close f]

ボタンがクリックされた時に close 関数が呼び出されるように設定しています。close 関数は引数のウィジェットを閉じます。ここではフレームが閉じることになりますが、wxHaskellではメインウィンドウが閉じた時には、アプリケーションも終了します。

ツールチップ

ツールチップ (Tooltip) は、ウィジェットの上にマウスカーソルを重ねると、表示される文字列です。

ツールチップを設定するには、ツールチップを表示させたいウィジェットの tooltip 属性に、表示させたい文字列を設定します。

tooltip.hs


module Main where

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

main :: IO ()
main = start gui

gui :: IO ()
gui = do
    f <- frame [text := "ツールチップ", clientSize := sz 270 150,
                    tooltip := "フレームです"]
    p <- panel f [clientSize := sz 500 500]
    b <- button p [text := "ボタン", position := pt 20 20,
                    tooltip := "ボタンです"]
    return ()
    

コード説明

tooltip := "フレームです"]

フレームウィジェットの tooltip 属性に、「フレームです」という文字列を設定しています。

tooltip := "ボタンです"]

ボタンウィジェットの tooltip 属性に、「ボタンです」という文字列を設定しています。

Windowsでは、ボタンのツールチップは表示されますが、フレームのツールチップは表示されません。macOSでは、ボタンとフレームの両方のツールチップが表示されます。


20519 visits
Posted: Jan. 02, 2019
Update: Jan. 05, 2019

ホーム   目次   ページトップ