나는 Haskell에서 경험이 없으며 Gtk2Hs를 사용하기 시작했습니다. 그래서 이것은 바보 같은 질문 일 수 있습니다.Gtk2Hs에서 DrawingArea를 사용하는 애니메이션
나는 정의 된 다음 Line
유형이 있습니다
type Coord = (Int,Int)
type Line = (Coord,Coord)
을 그리고 나는 DrawingArea
에 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
이 노출 될 때 함수가 호출됩니다 : 나는 Line
의 아직 그려 질 필요가있는 추적하기 위해 StateT
를 사용하여 고려하지만 한
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
나는 방법을 모른다 애니메이션을 구현하십시오. 상태를 변경 한 후에 매번 widgetShowAll
로 전화를 걸더라도 mainGUI
이 호출 될 때까지 창이 표시되지 않습니다.
drawCanvas
이 어떻게 든 도면을 처리하는 동안 상태를 지속적으로 업데이트하는 새 스레드를 만들 수 있습니까? 그렇다면 누군가 제게 그러한 행동의 예를 보여줄 수 있습니까? 아니면 아마 더 나은 접근 방법이 있을까요?