在Haskell中动态更新绘图

5
我有一个程序执行长时间的计算,结果以图形展示。目前我使用Chart-0.14实现。我想展示部分结果,并在计算过程中更新。函数Graphics.Rendering.Chart.Gtk.updateCanvas :: Renderable a -> DrawingArea -> IO Bool可以实现,但我无法从图形中获取DrawingArea。函数renderableToWindow :: Renderable a -> Int -> Int -> IO ()不返回任何内容(而且在窗口关闭前也不会返回)。
我想要实现如下功能:
main = do
drawingArea = forkRenderableToWindow (toRenderable $ plotLayout $
                     plot [0,0.1..10] sin "sin(x)") 640 480
updateCanvas  (toRenderable $ plotLayout $  plot [0,0.1..10] sin "sin(x)") drawingArea

我该如何做?我需要重新实现Graphics.Rendering.Chart.Gtk中的函数,以返回DrawingArea并以某种方式(我应该如何做?forkIO?)立即返回而不关闭窗口吗?

1个回答

2
您正在查找createRenderableWindow,然后您需要使用GTK操作来处理给定的Window - 我不认为Chart包导出任何更高级别的Window操作。
编辑2:请忽略下面的内容 - 即使进行了GUI初始化,它也无法正常工作。我的评论只是基于类型的猜测。 编辑: 这里有一些示例代码。理解,我只是根据类型将事物拼凑在一起。如果您询问实际了解该库的人,可能会有更好的方法。
下面我们使用:
1. createRenderableWindow - 这是我的答案的关键 2. castToDrawingArea - 这是从GTK提供的Window类型中获取DrawingArea所需的。我认为这些强制转换代替了C ++ OO继承。 3. widgetShowAll - 因为我们还没有显示窗口,最好这样做。在查看renderableToWindow源代码后,我偷了这个功能。 4. updateCanvas - 我在haddock文档中看到了这个,并认为这就是您想要首先获得DrawingArea的原因。
现在是代码:
import Graphics.Rendering.Chart.Gtk
import Graphics.Rendering.Chart.Renderable
import Graphics.UI.Gtk.Misc.DrawingArea
import qualified Graphics.UI.Gtk as G

main = do
        win  <- createRenderableWindow emptyRenderable 400 400
        let draw = castToDrawingArea win
        G.widgetShowAll win
        updateCanvas emptyRenderable draw

能否从窗口中提取DrawingArea,还是我需要以其他方式获取它? - Hjulle
@Hjulle 我认为你可以使用 castToDrawingArea 来达到这个目的。 - Thomas M. DuBuisson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接