1

Haskellとgtk2hsバインディングを使用してGTKで簡単な計算機を書いています。Gladeを使用してWindows電卓のように基本/科学ビューを実装しようとしています。

ボタンのGTKTableがありますが、それらのいくつかを非表示にしようとすると、ボタンの場所に空白が残ります。ボタンを非表示にするために、次のようなコードがあります。

bSqrt <- xmlGetWidget xml castToButton "bSqrt"
widgetHide bSqrt

しかし、4つのボタンを非表示にすると、右側に次のようなギャップができます。 ここに画像の説明を入力してください

私はGTKを初めて使用しますが、JavaSwingのようなレイアウトマネージャーを見つけることができませんでした。これを行う簡単な方法はありますか?どういうわけかレイアウトマネージャーを呼び出してボタンのサイズを変更できますか?ドキュメントでこれを行う方法を見つけることができませんでした。

前もって感謝します、

4

1 に答える 1

1

テーブルのような効果を実現するには、 HBoxVBoxのネストされた組み合わせを使用することを検討してください。「科学的」ボタンのVBoxを呼び出すと、その列が非表示になり、必要に応じて表示が更新されます。widgetHideAll

import Control.Monad (forM_)
import Data.IORef as IORef
import qualified Graphics.UI.Gtk as Gtk

data Mode = Basic | Scientific

main = do
    Gtk.initGUI

    window <- Gtk.windowNew
    outerVbox <- Gtk.vBoxNew False 0

    -- Create a "table" of buttons as an HBox of VBoxes.
    hbox <- Gtk.hBoxNew True 5

    -- Load the "table" with dummy 'basic' buttons.
    forM_ [0..2] $ \i -> do
        vbox <- Gtk.vBoxNew False 5
        forM_ [0..2] $ \j -> do
            dummy <- Gtk.buttonNewWithLabel $ show (3*i+j :: Int)
            Gtk.boxPackStartDefaults vbox dummy
        Gtk.boxPackStartDefaults hbox vbox

    -- Load rightmost column with 'scientific' buttons.
    scibox <- Gtk.vBoxNew False 5
    forM_ [0..2] $ \j -> do
        dummy <- Gtk.buttonNewWithLabel $ "sci" ++ show (j :: Int)
        Gtk.boxPackStartDefaults scibox dummy
    Gtk.boxPackStartDefaults hbox scibox

    -- Begin in Scientific mode.
    let mode = Scientific
    modeRef <- IORef.newIORef mode

    -- Create a mode-toggling Button.
    button <- Gtk.buttonNewWithLabel $ getButtonText mode
    Gtk.on button Gtk.buttonActivated $
        toggleMode button modeRef scibox

    -- Pack the "table" and button vertically into window.
    Gtk.boxPackStartDefaults outerVbox hbox
    Gtk.boxPackStartDefaults outerVbox button
    Gtk.containerAdd window outerVbox

    -- Standard Gtk stuff.
    Gtk.onDestroy window Gtk.mainQuit
    Gtk.widgetShowAll window
    Gtk.mainGUI

getButtonText Basic = "Switch to Scientific"
getButtonText Scientific = "Switch to Basic"


toggleMode button modeRef scibox = do
    mode <- IORef.readIORef modeRef
    case mode of
        Basic -> do
            IORef.writeIORef modeRef Scientific
            Gtk.buttonSetLabel button $ getButtonText Scientific
            Gtk.widgetShowAll scibox
        Scientific -> do
            IORef.writeIORef modeRef Basic
            Gtk.buttonSetLabel button $ getButtonText Basic
            Gtk.widgetHideAll scibox
于 2011-12-05T06:52:40.960 に答える