图表和gtk2hs

Diagrams and gtk2hs

我一直在做我的暑期研究项目,我一直在使用 Diagrams 库来绘制带有边、节点的图形。我正在模拟信息在整个图表中的传播,因此我的图表会不断更新。我拥有更新图的状态数据结构、绘制图表等的所有基础设施。

出于测试目的,我一直在使用带有 getLine 反馈循环的 SVG 后端,更新图表,然后将其呈现为相同的“.svg”文件。这显然是很劣质的,并且依赖于我的 .svg 查看器在文件更新时更新的事实。

我研究过为此使用 GTK 后端,因此我可以将图表渲染为 GTK window 中的 drawingArea。我已经安装了所有这些,并且一直在摆弄一些小程序。

但是我想不出如何实施我的程序。我看过很多关于如何在 GTK window 中绘制图表的示例,但其中 none 似乎包括基于按钮按下或什至来自命令的某些内容来更新该图像线。

我听说过一些关于 GTK 的多线程。我正在考虑编写如下函数:

renderDiagram :: DrawingArea -> Diagram B -> IO ()
renderDiagram c d = do
 c `on` exposeEvent $ do
   liftIO (defaultRender c d)
   return True
 widgetQueueDraw c

更改 canvas 公开时呈现的图表,然后强制公开事件。如果我然后 运行 我的主程序执行更新图形,并且 运行 在单独的线程上 renderDiagrammainGUI,我会得到我想要的结果吗?有更简洁的方法吗?

如果有人能给我指出正确的方向,或者提供一些外部阅读材料,那就太好了。谢谢。

你检查过这个article了吗?我认为这篇文章正好解释了您正在尝试做的事情。

如果您想在鼠标点击时执行某些操作,您可以使用 buttonPressEvent 而不是 motionNotifyEvent