【发布时间】:2013-01-02 05:12:30
【问题描述】:
我在 Haskell 方面的经验并不多,而且我刚刚开始使用 Gtk2Hs,所以这可能是一个愚蠢的问题。
我定义了以下Line 类型:
type Coord = (Int,Int)
type Line = (Coord,Coord)
我有一个函数可以在DrawingArea 上绘制Lines 的列表。问题是这个函数同时绘制所有Lines,但我想一次绘制一个,两个Lines之间有一点延迟。
render :: [Line] -> IO ()
render lines =
do initGUI
win <- windowNew
windowSetTitle win "Animation"
win `onDestroy` mainQuit
can <- drawingAreaNew
can `onSizeRequest` return (Requisition 400 400)
can `onExpose` drawCanvas lines can
but <- buttonNewWithLabel "Quit"
but `onClicked` mainQuit
hbox <- hBoxNew False 0
boxPackStart hbox but PackRepel 150
vbox <- vBoxNew False 5
containerAdd vbox can
containerAdd vbox hbox
containerAdd win vbox
widgetShowAll win
mainGUI
当DrawingArea 暴露时调用这个函数:
drawCanvas :: [Line] -> DrawingArea -> event -> IO Bool
drawCanvas lines can _evt =
do dw <- widgetGetDrawWindow can
drawWindowClear dw
gc <- gcNew dw
mapM_ (\(a,b) -> drawLine dw gc a b) lines
return True
我考虑过使用StateT 来跟踪哪些Lines 尚未绘制,但我不知道如何实现动画。即使每次更改状态后调用widgetShowAll,窗口也不会显示,直到调用mainGUI。
是否可以在drawCanvas 以某种方式处理绘图的同时创建一个不断更新状态的新线程?如果是这样,有人可以给我看一个这种行为的例子吗?或者有没有更好的方法?
【问题讨论】: