Gtk2Hs ウィジェット

ホーム   目次


ウィジェット(Widget)はGUIの部品です。この章では、ボタン(Button)、チェックボタン(CheckButton)、フレーム(Frame)、スケール(Scale)、ラベル(Label)、マークアップ付きラベル(Htmlで表現できるラベルです)を紹介します。

ボタン

「はじめに」と「macOSへのインストール」の章で紹介したサンプルと同じものです。

button.hs


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
    

チェックボタン

checkbutton.hs


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) は、子ウィジェットを視覚的にグループ化するためのコンテナウィジェットです。フレームには浮き彫りの枠線がつきますので、見えるコンテナです。またフレームにラベルをつけることもできます。

frame.hs


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」しか表示されません。

スケール

スケールは、スライダーのことです。スライダーという呼び方のほうが一般的かもしれません。

scale.hs


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のラベルは複数行の文字列を表示できまそ。

label.hs


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も表現できます。

markup.hs


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
    


19704 visits
Posted: Dec. 26, 2018
Update: Dec. 27, 2018

ホーム   目次   ページトップ