5

我目前正在遵循书中的练习:“Haskell School of Expression”,并且已经达到了关于创建图形的第三章。本书使用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 上运行。

4

3 回答 3

2

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

于 2013-01-20T03:58:47.660 回答
0

我正在使用当前版本的 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. getKeyEx从 SOE 模块导出
  2. 在问题中引用的代码中,更改k <- getKey wk <- getKeyEx w True
于 2013-02-04T08:01:30.607 回答
0

Daniel 是正确的,但我发现 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

进行此修复并 getKey 工作。

于 2017-02-12T17:20:51.253 回答