使用wx haskell更新小部件文本

时间:2015-11-17 12:01:49

标签: haskell wxhaskell

我正在制作一个简单的图像下载程序,以便在haskell中学习一些基本的gui内容。我有一个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 个答案:

答案 0 :(得分: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是bitrotten,必须更新import语句;如果用以下内容替换导入,它应该有效:

    import Graphics.UI.WX
    import Graphics.UI.WXCore hiding (Timer)
    import Data.Time          hiding (parseTime)
    import Control.Monad
    import System.Time
    import System.Environment