我在 Haskell 方面没有那么丰富的经验,而且我刚刚开始使用 Gtk2Hs,所以这可能是一个愚蠢的问题。
我Line
定义了以下类型:
type Coord = (Int,Int)
type Line = (Coord,Coord)
我有一个函数可以在 a 上绘制一个Line
s列表DrawingArea
。问题是这个函数Line
同时绘制所有 s 但我想一次绘制一个,两个Line
s 之间有一点延迟。
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
我考虑过使用 aStateT
来跟踪哪些Line
s 尚未绘制,但我不知道如何实现动画。即使widgetShowAll
每次更改状态后调用,窗口也不会显示,直到mainGUI
被调用。
是否可以创建一个新线程,在drawCanvas
以某种方式处理绘图的同时不断更新状态?如果是这样,有人可以给我看一个这种行为的例子吗?或者有没有更好的方法?