动态更新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我想你可以使用它。