2013-02-21 4 views
1

После установки WxHaskell и gtk2hs я играю с обоими, чтобы решить, какой из них выбрать. Для WxHaskell я обрабатываю документацию по адресу WxHaskell at haskell.org. Следующий первый пример из "Quick Start" раздел :wxHaskell: начальный размер кадра слишком мал

-- 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] 

Barring

Debug: wxColour::Set - couldn't set to colour string 'MEDIUM GREY' 

и линии, подобное следующему для различных форматов файлов изображений

Debug: Adding duplicate image handler for 'PNG file' 

Кодекса компилируется в тонкой форме и загружается в GHCi. Однако появившееся окно при запуске имеет высоту, которая равна нулю, только верхняя панель окна видна без изменения размера окна вручную, чтобы включить кнопку. Это происходит как при компиляции, так и при загрузке в GHCi. В GHCi высота будет правильной при выполнении основной секунды и любого последующего времени. Если я закрою и перезапустил сеанс GHCi, воля будет «плоской» и не будет включать кнопку при первом вызове на главный, но исправьте любые последующие вызовы. При компиляции кода и запуске вне GHCi окно всегда является плоским.

Это ошибка или устаревшее учебное пособие или что-то еще, что мне не хватает?

+0

Там известны проблемы с wxHaskell и GHCi: http://www.haskell.org/haskellwiki/WxHaskell/FAQ – stusmith

+0

Или вы имеете в виду окно всегда слишком мало? Если это так, вы можете добавить макет 'minsize'. – stusmith

+0

Это происходит как с GHCi, так и при компиляции кода с GHC. Я ожидал получить такое же поведение, что и экранные снимки в связанном примере. Добавление явного размера, например. с clientSize: = sz 150 100, размер окна соответствует, но было бы неплохо, если бы более поздний реальный код не выполнял размер элементов GUI. – 2013-02-22 10:13:47

ответ

3

Из ваших комментариев выше, это, вероятно, не то, что вы хотите, но для справки ...

Вместо того чтобы устанавливать размер можно установить минимальный размер:

set f [layout := minsize (sz 300 200) $ widget quit] 
1

You может сделать это так же, как и вы, используя wxWidgets в C++, то есть с макетами.

Например, вы можете использовать классификатор коробки:

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() 
Смежные вопросы