Haskell SOEGraphics窗口不会关闭



我目前正在按照书中的练习:"哈斯克尔表达学派",并已进入创建图形的第三章。本书使用SOEGraphics模块,演示如何在窗口中绘制一些简单的文本,然后按一下按钮将其关闭。

但是,在

编译和执行后,我发现尽管窗口在屏幕上显示文本,但无论我按哪个键或焦点是在命令行上还是窗口本身,窗口都拒绝关闭。

以下是本书的源代码:

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上运行。

尝试getKeyChar getKey .在某些操作系统中使用和/或行为的首选方法似乎发生了变化。

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

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

getKeyEx :: Window -> Bool -> IO Char

尽管 SOE 包本身中未记录,但此函数似乎在 Graphics.HGL.Utils 模块中模拟了其同名函数。

但是,getKey是从 SOE 模块导出的,getKeyEx不是。

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

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

丹尼尔是正确的,但我发现getKeyEx工作而仅使用getKeyEx的getKey却不工作很奇怪。 于是我看了看。 问题很明显。 这是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

进行此修复并获取密钥工作。

相关内容

  • 没有找到相关文章

最新更新