Обновить текст виджета с помощью wx haskell

Я делаю простой загрузчик изображений, чтобы изучить некоторые основные элементы графического интерфейса в haskell. У меня есть поле staticText, которое отображает имена файлов во время их загрузки.

У меня проблема с этой маленькой рекурсивной функцией.

saveImgs :: [String] -> IO ()
saveImgs [] = return ()
saveImgs (x:xs) = do
    let filename = tail $ x =~ "/[^/]*$"
    logMessage x
    maybeWrite filename =<< (simpleHttp x) `X.catch` statusExceptionHandler
    saveImgs xs
        where maybeWrite f b | b == L.empty = return ()
                             | otherwise    = L.writeFile f b

Он берет список URL изображений для сохранения и обновляет виджет textCtrl. За исключением того, что он обновляет текст только один раз, после того, как все сделано. Есть ли способ обновить текст текстового поля вручную?

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

timerClk <- timer f [on command := windowRefresh logBox False]

1 ответ

Вы можете попробовать обновить с помощью таймера, как это делается в http://dready.org/papers/wxHaskell/Watch.hs

Увидеть линию

    timerClk <- timer f [ on command := do { t <- getTimeString; set timeStatic [text := t]; windowRefresh timeStatic False} ]

Обратите внимание, что Watch.hs является битротеном, операторы импорта должны быть обновлены; это должно работать, если вы замените импорт на:

    import Graphics.UI.WX
    import Graphics.UI.WXCore hiding (Timer)
    import Data.Time          hiding (parseTime)
    import Control.Monad
    import System.Time
    import System.Environment
Другие вопросы по тегам