动态更新Haskell中的绘图

Hju*_*lle 5 plot haskell

我有一个执行长时间计算的程序,其结果显示为绘图.我目前正在使用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
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我是否需要在Graphics.Rendering.Chart.Gtk一个版本中重新实现函数,DrawingArea以及以某种方式返回(我将如何执行此操作?forkIO?)立即返回而不关闭窗口?

Tho*_*son 2

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

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

下面我们使用:

  1. createRenderableWindow- 这是我回答的关键
  2. castToDrawingAreaDrawingArea- 这是从WindowGTK 提供的类型中获取 a 所必需的。我认为这些转换正在取代 C++ OO 继承。
  3. widgetShowAll- 因为我们实际上还没有显示窗口,所以我们最好这样做。我在查看了 的源代码后窃取了这个函数renderableToWindow
  4. updateCanvas- 我刚刚在黑线鳕文档中看到了这一点,并认为这就是您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
Run Code Online (Sandbox Code Playgroud)