我一直在做我的暑期研究项目,并且一直在使用Diagrams库绘制带有边,节点的图。我正在模拟整个图表中的信息分布,因此我的图表不断地离散更新。我拥有用于更新图的状态数据结构,绘制图等的所有基础结构。
出于测试目的,我刚刚使用了带有getLine
反馈循环的SVG后端,更新了图表,然后将其呈现到相同的'.svg'文件中。这显然是伪劣的,它依赖于我的.svg查看器在文件更新时进行更新的事实。
我已经研究过为此使用GTK后端,因此我可以将图呈现到GTK窗口中的drawingArea
。我已经安装了所有这些程序,并且一直在搞一些小程序。
但是,我无法集中精力实现程序。我已经看到了很多关于如何在GTK窗口中绘制图表的示例,但是似乎没有一个示例包含基于按钮甚至是命令行的更新。
我听说过一些关于GTK多线程的知识。我正在考虑编写如下函数:
renderDiagram :: DrawingArea -> Diagram B -> IO ()
renderDiagram c d = do
c `on` exposeEvent $ do
liftIO (defaultRender c d)
return True
widgetQueueDraw c
要更改暴露画布时呈现的图表,然后强制暴露事件。如果然后运行我的主程序执行来更新图形,并在renderDiagram
的单独线程上运行mainGUI
,是否可以获得我想要的结果?有没有更清洁的方法可以做到这一点?
如果有人可以向我指出正确的方向,或者提供一些外部阅读,那就太好了。谢谢。
答案 0 :(得分:0)
您检查了此article吗?我认为这篇文章说明了您正在尝试做的事情。
如果要在单击鼠标时执行某些操作,则可以使用buttonPressEvent
代替motionNotifyEvent
。