Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态更新Haskell中的绘图_Haskell_Plot - Fatal编程技术网

动态更新Haskell中的绘图

动态更新Haskell中的绘图,haskell,plot,Haskell,Plot,我有一个程序,它执行一个长期的计算,结果显示为一个绘图。 我目前正在使用这个。我想显示部分结果,并在计算期间更新。 Graphics.Rendering.Chart.Gtk.updateCanvas::Renderable a->DrawingArea->IO Bool似乎可以做到这一点,但我找不到任何方法从绘图中获取DrawingArea。函数renderableToWindow::Renderable a->Int->Int->IO()不返回任何内容(而且在关闭窗口之前也不返回) 我想做如下

我有一个程序,它执行一个长期的计算,结果显示为一个绘图。 我目前正在使用这个。我想显示部分结果,并在计算期间更新。
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
中的函数,以及以某种方式(我将如何实现?forkIO?)在不关闭窗口的情况下立即返回?

您正在查找,然后您需要使用GTK操作来处理给定的
窗口
-我认为图表包不会在
窗口
上导出任何更高级别的操作

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

下面我们使用:

  • createRenderableWindow
    ——这是我答案的关键
  • castToDrawingArea
    -这是从GTK提供的
    窗口获取
    DrawingArea
    类型所必需的。我认为,这些转换是C++的OO继承。
  • widgetShowAll
    -因为我们还没有实际显示窗口,所以最好这样做。在查看
    renderableToWindow
    的源代码后,我偷了这个函数
  • 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
    
    import Graphics.Rendering.Chart.Gtk
    导入Graphics.Rendering.Chart.Renderable
    导入Graphics.UI.Gtk.Misc.DrawingArea
    将合格的Graphics.UI.Gtk导入为G
    main=do
    
    win是否可以从窗口提取绘图区域,或者我需要以其他方式获取它?@Hjulle我想你可以使用它。