Вызвать диспетчер компоновки после удаления кнопок

Я пишу простой калькулятор в GTK, используя Haskell и привязки gtk2hs. Я пытаюсь реализовать базовое / научное представление, как в калькуляторе Windows, с помощью Glade.

У меня есть GTKTable кнопок, но когда я пытаюсь скрыть некоторые из них, остается пустое место там, где находятся кнопки. Чтобы скрыть кнопки, у меня есть такой код:

bSqrt <- xmlGetWidget xml castToButton "bSqrt"
widgetHide bSqrt

Но когда я скрываю четыре кнопки, которые мне нужны, у меня появляется пробел, как показано ниже, с правой стороны: введите здесь описание изображения

Я новичок в GTK, и мне не удалось найти таких менеджеров по компоновке, как вы в java swing. Есть ли более простой способ сделать это? Могу ли я каким-то образом вызвать диспетчер компоновки, чтобы изменить размер кнопок за меня? Мне не удалось найти способ сделать это в документации.

Заранее спасибо,


person CalumMcCall    schedule 29.11.2011    source источник
comment
Какой менеджер по расположению вы используете? Возможно, вам стоит вставить код и инструкции для воспроизведения вашей проблемы.   -  person Daniel Wagner    schedule 29.11.2011
comment
Пользуюсь Поляной-3. Я добавил несколько деталей выше. Мой макет довольно простой. VBox с GTKTable внутри. Мне кажется, что я просто не знаком с основами GTK. Как вы меняете расположение кнопок во время выполнения? это возможно в GTK?   -  person CalumMcCall    schedule 30.11.2011
comment
Работает ли refresh из этот ответ?   -  person Daniel Wagner    schedule 30.11.2011
comment
он изменяет размер окна, но все равно оставляет пространство. Это может быть связано с тем, что кнопки находятся в GTKTable внутри окна, а не непосредственно в окне в примере, с которым вы связались. Думаю, я просто откажусь от этого, мне на это не стоит тратить время. Большое спасибо за вашу помощь, я ценю это   -  person CalumMcCall    schedule 30.11.2011
comment
В этом случае вам, вероятно, потребуется удалить виджеты из контейнера таблицы и уменьшить количество столбцов в таблице. Без более конкретного кода для тестирования очень сложно ответить точно: как и в случае с другим кодом графического интерфейса, способ решить проблему - это тыкать в него, пока он не сделает то, что вы хотите.   -  person Daniel Wagner    schedule 30.11.2011
comment
ах, ладно, я мог бы просто уничтожить таблицу и создать новую, я полагаю. Это часть задания, которое должно быть скоро, но это просто то, что я надеялся добавить для развлечения. К сожалению, я не могу позволить себе потратить на это больше времени, но, возможно, я попробую опробовать ваши предложения в эти выходные, еще раз спасибо.   -  person CalumMcCall    schedule 30.11.2011


Ответы (1)


Рассмотрите возможность использования вложенной комбинации HBox и VBox для достижения табличный эффект. Вызов widgetHideAll в VBox «научных» кнопок скроет этот столбец и обновит отображение по желанию.

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
person m p    schedule 05.12.2011