【问题标题】:Invoke layout manager after removing buttons删除按钮后调用布局管理器
【发布时间】:2011-12-05 14:52:40
【问题描述】:

我正在使用 Haskell 和 gtk2hs 绑定在 GTK 中编写一个简单的计算器。 我正在尝试使用 Glade 在 Windows 计算器中实现基本/科学视图。

我有一个 GTKTable 按钮,但是当我尝试隐藏其中一些按钮时,会在按钮所在的位置留下一个空白区域。要隐藏按钮,我有一些这样的代码:

bSqrt <- xmlGetWidget xml castToButton "bSqrt"
widgetHide bSqrt

但是当我隐藏我想要的四个按钮时,我在右侧有一个如下所示的间隙:

我是 GTK 的新手,我找不到像你在 java swing 中那样的布局管理器。有没有更简单的方法来做到这一点?我可以以某种方式调用布局管理器来为我调整按钮的大小吗?我无法在文档中找到执行此操作的方法。

提前致谢,

【问题讨论】:

  • 您使用的是什么布局管理器?也许您应该粘贴一些代码和说明来重现您的问题。
  • 我正在使用 Glade-3。我在上面添加了更多细节。我的布局非常基本。 VBox 里面有一个 GTKTable。我觉得我只是对 GTK 基础知识一无所知。你如何在运行时重新布局按钮?这在 GTK 中可行吗?
  • 来自this answerrefresh 有效吗?
  • 它改变了窗口大小,但它仍然留下空间。这可能是因为按钮位于窗口内的 GTKTable 中,而不是在您链接到的示例中直接位于窗口中。我想我会放弃这个,现在对我来说不值得花时间。非常感谢您的帮助,我很感激
  • 在这种情况下,您可能需要从表格容器中删除小部件并减少表格中的列数。如果没有更具体的代码进行测试,很难确定答案:与其他 GUI 代码一样,解决问题的方法是不断探索它,直到它完成你想要的为止。

标签: layout haskell button resize gtk2


【解决方案1】:

考虑使用HBoxVBox 的嵌套组合来实现table-like 效果。在“科学”按钮的 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

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多