Haskell SOEGraphics窗口不会关闭

时间:2012-09-20 00:41:19

标签: haskell graphics io

我目前正在按照书中的练习:“哈斯克尔表达学校”进行第三章创建图形。本书使用SOEGraphics模块,演示在窗口中绘制一些简单文本,然后按下按钮关闭它。

然而,在编译和执行之后,我发现尽管窗口出现了屏幕上的文本,但无论我按哪个键或者焦点是在命令行还是窗口本身,窗口都会拒绝关闭。 / p>

以下是本书的源代码:

module Main where
import SOE
main =  runGraphics(
        do  w <- openWindow
                "My First Graphics Program" (300, 300)
            drawInWindow w (text(100,200) "HelloGraphicsWorld")
            k <- getKey w
            closeWindow w
        )

让窗口关闭的唯一方法是强制它使用CTRL-C退出。我的代码中是否有一些我忽略的东西?该程序使用GHC 7.4.1编译,并在Ubuntu上运行。

3 个答案:

答案 0 :(得分:2)

托盘getKeyChar代替getKey。在某些OSsp中使用和/或行为的首选方法似乎发生了变化

答案 1 :(得分:0)

我正在使用SOE软件包的current release,该软件包在问题发布前约9个月发布。就像问题的海报一样,我在Ubuntu(12.04)上运行GHCi 7.4.1。我遇到了同样的问题,但DuckMaestro的答案并不适用:

getKeyChar未在SOE包中的任何模块中定义。但是,getKeyEx是:

getKeyEx :: Window -> Bool -> IO Char

虽然在SOE包本身没有记录,但此函数似乎模拟Graphics.HGL.Utils模块中的namesake

但是,虽然getKey是从SOE模块导出的,但getKeyEx却不是。{/ p>

为了编译并关闭按键事件窗口

  1. 从SOE模块
  2. 导出getKeyEx
  3. 在问题中引用的代码中,将k <- getKey w更改为k <- getKeyEx w True

答案 2 :(得分:0)

Daniel是正确的,但我发现当getKey只使用getKeyEx时,getKeyEx无效。所以我看了。问题很清楚。这是getKey的现有代码

getKey win = do
  ch <- getKeyEx win True
  if ch == '\x0' then return ch
    else getKeyEx win False

这里应该是什么

getKey win = do
  ch <- getKeyEx win True
  if ch /= '\x0' then return ch
    else getKeyEx win False

进行此修复并使getKey正常工作。