ウィジェット(Widget)はGUIの部品です。この章では、ボタン(Button)、チェックボタン(CheckButton)、フレーム(Frame)、スケール(Scale)、ラベル(Label)、マークアップ付きラベル(Htmlで表現できるラベルです)を紹介します。
「はじめに」と「macOSへのインストール」の章で紹介したサンプルと同じものです。
import Graphics.UI.Gtk
main :: IO()
main = do
initGUI
window <- windowNew
set window [windowTitle := "ボタン"]
windowSetDefaultSize window 230 150
containerSetBorderWidth window 15
windowSetPosition window WinPosCenter
align <- alignmentNew 1 1 0 0
containerAdd window align
button <- buttonNewWithLabel "終了"
widgetSetSizeRequest button 100 30
containerAdd align button
on button buttonActivated $ do
mainQuit
widgetHide window
on window objectDestroy mainQuit
widgetShowAll window
mainGUI
import Graphics.UI.Gtk
toggleTitle :: CheckButton -> Window -> IO()
toggleTitle cb window = do
bool <- toggleButtonGetActive cb
if bool
then do
set window [windowTitle := "チェックボタン"]
else do
set window [windowTitle := ""]
main :: IO()
main = do
initGUI
window <- windowNew
windowSetPosition window WinPosCenter
containerSetBorderWidth window 15
windowSetDefaultSize window 230 150
set window [windowTitle := "チェックボタン"]
align <- alignmentNew 0 0 0 0
containerAdd window align
cb <- checkButtonNewWithLabel "タイトルを表示する"
toggleButtonSetActive cb True
widgetSetCanFocus cb True
containerAdd align cb
on window objectDestroy mainQuit
on cb buttonActivated $ toggleTitle cb window
widgetShowAll window
mainGUI
フレーム (Frame) は、子ウィジェットを視覚的にグループ化するためのコンテナウィジェットです。フレームには浮き彫りの枠線がつきますので、見えるコンテナです。またフレームにラベルをつけることもできます。
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
windowSetPosition window WinPosCenter
windowSetDefaultSize window 250 250
set window [windowTitle := "フレーム"]
containerSetBorderWidth window 10
table <- tableNew 2 2 True
tableSetRowSpacings table 10
tableSetColSpacings table 10
containerAdd window table
frame1 <- frameNew
frameSetLabel frame1 "Shadow In"
frameSetShadowType frame1 ShadowIn
frame2 <- frameNew
frameSetLabel frame2 "Shadow Out"
frameSetShadowType frame2 ShadowOut
frame3 <- frameNew
frameSetLabel frame3 "Etched In"
frameSetShadowType frame3 ShadowEtchedIn
frame4 <- frameNew
frameSetLabel frame4 "Etched Out"
frameSetShadowType frame4 ShadowEtchedOut
tableAttachDefaults table frame1 0 1 0 1
tableAttachDefaults table frame2 0 1 1 2
tableAttachDefaults table frame3 1 2 0 1
tableAttachDefaults table frame4 1 2 1 2
on window objectDestroy mainQuit
widgetShowAll window
mainGUI
WindowsとmacOSでは、4種類のフレームが見えますが、Linux Mint 18ではすべて単線のフレームになります。さらにLinux Mint 17のGtk2Hsでは「Shadow In」しか表示されません。
スケールは、スライダーのことです。スライダーという呼び方のほうが一般的かもしれません。
import Graphics.UI.Gtk
value_changed :: HScale -> Label -> IO ()
value_changed range label = do
val <- rangeGetValue range
labelSetText label (show(floor val))
main :: IO ()
main = do
initGUI
window <- windowNew
windowSetPosition window WinPosCenter
windowSetDefaultSize window 300 250
containerSetBorderWidth window 10
set window [windowTitle := "スケール"]
hbox <- hBoxNew False 20
hscale <- hScaleNewWithRange 0 100 1
scaleSetDrawValue hscale False
widgetSetSizeRequest hscale 150 30
label <- labelNew (Just "0")
miscSetAlignment label 0.0 1
boxPackStart hbox hscale PackNatural 0
boxPackStart hbox label PackNatural 0
halign <- alignmentNew 0 0 0 0
containerAdd halign hbox
containerAdd window halign
on window objectDestroy mainQuit
on hscale valueChanged $ value_changed hscale label
widgetShowAll window
mainGUI
ラベルウィジェットは文字列を表示します。多くのGUIフレームワークでは、ラベルは単一行の文字列を表示することしかできませんが、Gtk2Hsのラベルは複数行の文字列を表示できまそ。
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
windowSetPosition window WinPosCenter
set window [windowTitle := "No sleep"]
containerSetBorderWidth window 15
label <- labelNew (Just (
"I've always been too lame\n" ++
"To see what's before me\n" ++
"And I know nothing sweeter than\n" ++
"Champaign from last New Years\n" ++
"Sweet music in my ears\n" ++
"And a night full of no fears\n" ++
"\n" ++
"But if I had one wish fulfilled tonight\n" ++
"I'd ask for the sun to never rise\n" ++
"If God passed a mic to me to speadk\n" ++
"I'd say \"Stay in bed, world,\n" ++
"Sleep in peace"
))
labelSetJustify label JustifyCenter
containerAdd window label
on window objectDestroy mainQuit
widgetShowAll window
mainGUI
ラベルの文字列は改行文字「\n」で改行できます。文字列と文字列を繋ぐには「++」を使います。
ウィンドウを拡大しても、ラベルは中央に表示されます。ウィンドウコンテナはレイアウトを指定しなければ、子ウィジェットは常に中央に表示されます。
Gtk2HsのラベルはHtmlも表現できます。
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
windowSetPosition window WinPosCenter
windowSetDefaultSize window 300 100
set window [windowTitle := "マークアップ付きラベル"]
let str = "<b>Gtk2Hs </b>チュートリアル"
label <- labelNew (Just "")
labelSetMarkup label str
containerAdd window label
widgetShowAll window
on window objectDestroy mainQuit
mainGUI