import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
widgetShow window
on window objectDestroy mainQuit
mainGUI
Haskell では、インデントを2スペースにする慣習があるみたいです(2スペースでなくても正常に動作します)。そしてインテントはタブでなく半角スペースでなければインタプリタやコンパイラが警告を出します(エラーではないので実行は出来ます)。警告はインデントされたすべての行に出ますので、うっとおしいです。ここは指定されたとおり2スペースにしています。
最初の例なのですべての行を説明します。
import Graphics.UI.Gtk
Graphics.UI.Gtkは、Gtk2Hsを使うためのもっとも基本となるモジュールです。これを読み込まないとGtk2Hsアプリは起動しません。このモジュールで読み込まれた関数を、ここでは標準関数、もしくは単に関数と記述することにします。
main :: IO ()
main 関数を定義しています。多くのプログラミング言語と同じく、Gtk2Hsのプログラムも main 関数から始まる決まりになっています。関数では「::」の後に引数と戻り値の型を「−>」で区切って記述します。この例では「−>」がなく、型が一つしか指定されていません。型が一つしか指定されていない場合はその型が戻り値の型になります。「IO ()」は、値のないモナド型という意味になります。モナドは、Haskelleでもっとも難しい概念で、高度なユーザーインターフェースを表すそうです。
main = do
main 関数の実装部分です。実装が一式なら、「main = 式」と書きます。複数の式がある場合は、「main = do」と記述して、次の行からインデントさせて複数の式を記述します。
initGUI
GUIを実装する場合は、必ず記述することになっている標準関数です。名前から察するに「GUIを初期化する」という関数でしょう。
window <- windowNew
「windowNew」はウィンドウを作る標準関数です。作られたウィンドウは「window」という名前に関連付けられます。
widgetShow window
「widgetShow」標準関数は、引数で指定されたウィジェットを見える状態にします。ウィジェットはGUIの部品のことです。ここでは「window」を見える状態にしています。
on window objectDestroy mainQuit
「on」はイベントの発生を捉えます。そのイベントとは「window」の「objectDestroy」イベントです。「objectDestroy」はそのオブジェクトがなくなるときに発生するイベントです。そして、イベントが発生した時の振る舞いを最後に指定します。「mainQuit」はアプリケーションを終了させる標準関数です。
mainGUI
メインループを始める標準関数です。これを記述しないと起動したアプリケーションは、一瞬で終了します。
位置を指定していないので、スクリーンの左上に表示されます。
Linux Mintでは、位置を指定しない場合は中央に表示されます。これはGtk2Hsだけでなく、すべてのアプリケーションのデフォルトです。
この例では、ウィンドウをメインスクリーンの中央に表示します
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "中央"]
windowSetDefaultSize window 230 150
windowSetPosition window WinPosCenter
widgetShow window
on window objectDestroy mainQuit
mainGUI
set window [windowTitle := "中央"]
ウィンドウのタイトルを「中央」に設定しています。Haskelでは、値を与える場合「:= 値」と記述します。「set」関数は引数のオブジェクトの属性 (attributes) を設定します。ここでは「window」オブジェクトの「windowTitle」属性を「中央」に設定しています。
windowSetDefaultSize window 230 150
「windowSetDefaultSize」は、引数のウィンドウの幅と高さを設定します。第2引数が幅のピクセル数、第3引数が高さのピクセル数になります。
windowSetPosition window WinPosCenter
「windowSetPosition」関数は引数のウィンドウの表示位置を設定します。WinPosCenterはGtk2Hsで定義されている定数で、ウィンドウの表示位置をセンターに指定します。
ツールチップ (Tooltip) は、ウィジェットの上にマウスカーソルを持っていくと表示される、小さな案内です。
この例では「tooltip3.hs」と「tooltip2.hs」の2つの例を書きました。ファイル名の末尾が「3」のファイルは、Gtk3Hs対応で、ファイル名の末尾が「2」のファイルはGtk2Hs対応です。今までの末尾に番号がついていないファイルは、Gtk3HsとGtk2Hsの両方で実行できます。
WindowsとmacOSの場合、このチュートリアルの「はじめに」と「macOSへのインストール」どおりにインストールした場合は、Gtk3Hsがインストールされています。WindowsとmacOSのGtk3Hsでは、ツールチップについては、両方のファイルを理解して実行できます。Linuxでは、システムにインストールされている、GtkHsのバージョンに合わせたファイルしか実行できません。
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "ツールチップ"]
windowSetDefaultSize window 300 200
containerSetBorderWidth window 15
button <- buttonNewWithLabel "ボタン"
widgetSetTooltipText button (Just "ボタンウィジェット")
halign <- alignmentNew 0 0 0 0
containerAdd halign button
containerAdd window halign
widgetShowAll window
on window objectDestroy mainQuit
mainGUI
containerSetBorderWidth window 15
「containerSetBorderWidth」関数は、コンテナーと呼ばれる、内部に子ウィジェットを配置できるウィジェットの枠の幅を設定します。ここでは「window」の枠の幅を15ピクセルに設定しています。ウィンドウは内部に子ウィジェットを配置できるコンテナーです。
button <- buttonNewWithLabel "ボタン"
「buttonNewWithLabel」関数は引数で指定された文字列のボタンを作成します。
widgetSetTooltipText button (Just "ボタンウィジェット")
「widgetSetTooltipText」は第1引数のウィジェットに第2引数の文字列を設定します。「(Just "ボタンウィジェット")」の「Just」は一種の型指定です。関数によっては「Just」を要求する関数があります。
halign <- alignmentNew 0 0 0 0
「alignmentNew」はAlimentと呼ばれる整列ウィジェットを作ります。第1引数はx座標の位置を0か1で指定します。0の場合は左に、1の場合は右に配置します。第2引数はy座標の位置を0か1で指定します。0の場合は上に、1の場合は下に配置します。第3引数は、x軸に拡大するかどうかを0か1で指定します。0の場合は拡大せず、1の場合は拡大します。第4引数は、y軸に拡大するかどうかを0か1で指定します。0の場合は拡大せず、1の場合は拡大します。このAlignmentはとても便利なウィジェットです。
containerAdd halign button
「containerAdd」は第1引数のウィジェットに第2引数のウィジェットを配置します。第1引数はコンテナーでなければなりません。
containerAdd window halign
「window」ウィジェットに「halign」ウィジェットを配置しています。これにより前の行と合わせて「button」ウィジェットが、ウィンドウの左上に拡大されずに配置されます。
widgetShowAll window
「widgetShowAll」は、引数で指定したウィジェットとその子ウィジェットのすべてを見えるようにします。
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "ツールチップ"]
windowSetDefaultSize window 300 200
containerSetBorderWidth window 15
button <- buttonNewWithLabel "ボタン"
tlt <- tooltipsNew
tooltipsSetTip tlt button "ボタンウィジェット" "T1"
halign <- alignmentNew 0 0 0 0
containerAdd halign button
containerAdd window halign
widgetShowAll window
on window objectDestroy mainQuit
mainGUI
tlt <- tooltipsNew
tooltipsSetTip tlt button "ボタンウィジェット" "T1"
Gtk3Hsでは、ウィジェットに対して直接ツールチップを設定できますが、Gtk2Hsでは、まずツールチップウィジェットを作成して、そのツールチップウィジェットをウィジェットに設定します。最後の「"T1"」ツールチップウィジェットを識別するための名前です。Gtk2Hsのツールチップでは名前をつける決まりになっています。
ニーモニック (mnemonic) は、ボタンやメニューに設定できる1文字のショートカットキーで、Altキーと設定した文字キーを同時に押すと、そのボタンやメニューをクリックしたことになります。
import Graphics.UI.Gtk
printMsg :: IO ()
printMsg = do
putStrLn "Button clicked"
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "Mnemonic",
windowDefaultWidth := 300,
windowDefaultHeight := 200,
containerBorderWidth := 15]
button <- buttonNewWithMnemonic "_Button"
on button buttonActivated printMsg
halign <- alignmentNew 0 0 0 0
containerAdd halign button
containerAdd window halign
widgetShowAll window
on window objectDestroy mainQuit
mainGUI
printMsg :: IO ()
printMsg = do
putStrLn "Button clicked"
printMsg 関数を定義しています。「putStrLn」関数は引数の文字列を標準出力に表示します。標準出力は Windows ではコマンドプロンプト、macOSやLinuxではターミナルに設定されています。
set window [windowTitle := "Mnemonic",
windowDefaultWidth := 300,
windowDefaultHeight := 200,
containerBorderWidth := 15]
「set」を使って、ウィンドウウィジェットの多くの属性を設定できます。関数で個別に設定するのではなく、「set」を使ってこのようにまとめて設定する方法が今後の主流になるそうです。
button <- buttonNewWithMnemonic "_Button"
下線 (アンダースコア) を前に付けられた文字がニーモニックになります。ここでは「B」がニーモニックになります。
on button buttonActivated printMsg
ボタンをクリックされた時のイベントは「buttonActivated」です。