使用Haskell和Gtk2hs,我将如何创建新的窗口小部件和相关事件?

时间:2012-09-20 17:56:14

标签: haskell gtk2hs

我有一个正在处理的应用程序,我基本上是自学GUI编程。我在programmers.stackexchange上问了一个相当involved question的问题。这个问题是关于我没有尝试过的想法的机制。

我有三个小部件:TreeView,TextField和DrawingArea。三个小部件中的每一个都与一个必然触发另一个动作的事件非常密切地相互作用。通过读取包含全局应用程序状态的MVar,这三个小部件在很大程度上不与应用程序的其余部分进行交互,除了(到目前为止)。

目前,我认为大型应用程序不应直接与这三个小部件中的任何一个进行交互。此外,将复制相同的模式以审查具有相同形式的其他数据。因此,在我看来,实际将这三个小部件绑定到一个更大的复合小部件中是有意义的,它可以与GTK的正常事件队列进行交互。所以,例如

type MyDataViewWidget = (TreeView, TextField, DrawingArea)
data DataUpdatedSignal a = DataUpdatedSignal a
data RedrawEvent a = RedrawEvent a

因此,小部件将使用DataUpdatedEvent向应用程序的其余部分指示MyDataViewWidget内的某些内容发生了变化,而RedrawEvent会告诉小部件它需要重绘或重新读取源数据。

(从技术上讲,我没有从语义上考虑复合小部件中的各种操作会做什么...小部件是否只有应用程序数据的只读副本,是否需要接收新的只读副本RedrawEvent或者小部件可以拥有MVar本身,并允许更改MVar中的数据等等......我只是对如何实际执行此操作感兴趣)

有没有做过这样的事情的例子?基本上,我需要实现哪些实例来创建新的小部件和两个信号?我更喜欢坚持使用Haskell,但我可以使用C来构建新的小部件。

1 个答案:

答案 0 :(得分:5)

不幸的是,目前没有纯Haskell方法(正确地)实现Widget类型类。您需要在C中实现您的小部件,然后通过FFI导入它。有很多例子 - 基本上所有gtk + / gtk2hs都是数百个这样做的例子的集合。