wxHaskell: слишком маленький начальный размер кадра
После установки WxHaskell и gtk2hs я играю с обоими, чтобы решить, какой из них выбрать. Для WxHaskell я работаю с документацией на WxHaskell на haskell.org. Следующий первый пример взят из раздела "Быстрый старт":
-- Copied from www.haskell.org/haskellwiki/WxHaskell/Quick_start
module Main where
import Graphics.UI.WX
main :: IO ()
main
= start hello
hello :: IO ()
hello
= do f <- frame [text := "Hello!"]
quit <- button f [text := "Quit", on command := close f]
set f [layout := widget quit]
за исключением
Debug: wxColour::Set - couldn't set to colour string 'MEDIUM GREY'
и строки, похожие на следующие для различных форматов файлов изображений
Debug: Adding duplicate image handler for 'PNG file'
код прекрасно компилируется и прекрасно загружается в GHCi. Тем не менее, появляющееся окно при запуске имеет высоту, равную нулю, видна только верхняя панель окна без изменения размера окна вручную, чтобы включить кнопку. Это происходит как при компиляции, так и при загрузке в GHCi. В GHCi высота будет правильной при выполнении main в секунду и в любой следующий раз. Если я закрою и перезапущу сеанс GHCi, это будет "плоским" и не будет включать кнопку при первом обращении к основному, но будет корректным при любых последующих вызовах. При компиляции кода и запуске вне GHCi окно всегда плоское.
Это ошибка, или учебник устарел, или что-то еще мне не хватает?
2 ответа
Из ваших комментариев выше, это, вероятно, не то, что вы хотите, но для справки...
Вместо установки размера вы можете установить минимальный размер:
set f [layout := minsize (sz 300 200) $ widget quit]
Вы можете сделать это так же, как и при использовании wxWidgets в C++, то есть с макетами.
Например, вы можете использовать коробку Sizer:
module Main where
import Data.Bits
import Graphics.UI.WX
import Graphics.UI.WXCore.WxcDefs
import Graphics.UI.WXCore.Frame
import Graphics.UI.WXCore.WxcClassesAL
import Graphics.UI.WXCore.WxcClassesMZ
import Graphics.UI.WXCore.WxcTypes
main :: IO ()
main = start simple
simple :: IO ()
simple = do
hbox <- boxSizerCreate wxHORIZONTAL
window <- frame [text := "Title"]
quitButton <- button window [text := "Quit", on command := close window]
exitButton <- button window [text := "Exit", on command := close window]
windowSetSizer window hbox
sizerAddWindow hbox exitButton 1 (wxEXPAND .|. wxALL) 5 ptrNull
sizerAddWindow hbox quitButton 1 (wxEXPAND .|. wxALL) 5 ptrNull
frameCenter window
return ()