动态更新Haskell中的绘图

时间:2011-10-02 09:55:36

标签: haskell plot

我有一个执行长时间计算的程序,其结果显示为绘图。 我目前正在使用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 个答案:

答案 0 :(得分:2)

您正在寻找createRenderableWindow,然后您需要使用GTK操作来处理给定的Window - 我认为Chart包不会在{{1}上导出任何更高级别的操作}第

EDIT2:所以忽略下面的内容 - 即使使用GUI启动它也不起作用。我的评论是基于类型的猜测。 编辑: 这是一些示例代码。明白了,我只是根据类型将事情拼凑在一起。如果你问一个真正了解图书馆的人,可能会有更好的办法。

下面我们使用:

  1. Window - 这是我答案的关键
  2. createRenderableWindow - 需要从GTK提供的castToDrawingArea类型中获取DrawingArea。我认为这些演员阵容取代了C ++ OO继承。
  3. Window - 因为我们实际上没有显示窗口,所以我们最好这样做。在查看widgetShowAll
  4. 的来源后,我偷了这个函数
  5. renderableToWindow - 我刚刚在haddock文档中看到了这一点,并认为这就是为什么你想要updateCanvas的原因。
  6. 现在代码:

    DrawingArea