我有一个执行长时间计算的程序,其结果显示为绘图.我目前正在使用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?)立即返回而不关闭窗口?
你正在寻找createRenderableWindow,然后你需要使用 GTK 操作来处理给定的Window- 我不认为 Chart 包导出任何更高级别的操作Window。
EDIT2:所以忽略下面的内容 - 即使 GUI 初始化它也不起作用。我的评论是基于类型的猜测。编辑:这是一些示例代码。请理解,我只是根据类型将事物拼凑在一起。如果你询问真正了解图书馆的人,可能会有更好的方法。
下面我们使用:
createRenderableWindow- 这是我回答的关键castToDrawingAreaDrawingArea- 这是从WindowGTK 提供的类型中获取 a 所必需的。我认为这些转换正在取代 C++ OO 继承。widgetShowAll- 因为我们实际上还没有显示窗口,所以我们最好这样做。我在查看了 的源代码后窃取了这个函数renderableToWindow。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)