1
我對Haskell並不是很有經驗,我剛開始使用Gtk2Hs,所以這可能是一個愚蠢的問題。在Gtk2Hs中使用DrawingArea的動畫
我已經定義了以下Line
類型:
type Coord = (Int,Int)
type Line = (Coord,Coord)
而且我有借鑑了DrawingArea
的Line
個列表的功能。問題是這個函數同時繪製了所有的Line
,但是我想在兩個Line
之間稍微延遲一次繪製一個。
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
跟蹤其中Line
■找尚未得出考慮,但我不知道該怎麼實施動畫。即使每次改變狀態後都會調用widgetShowAll
,窗口將不會顯示,直到調用mainGUI
。
是否有可能創造一個新的線程,不斷更新狀態,而drawCanvas
以某種方式照顧繪圖?如果是這樣,請有人給我看一個這樣的行爲的例子嗎?或者有更好的方法嗎?