【问题标题】:Haskell SOEGraphics window wont closeHaskell SOEGraphics 窗口不会关闭
【发布时间】:2012-09-20 00:41:18
【问题描述】:

我目前正在学习《The 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 上运行。

【问题讨论】:

  • 你从哪里得到的模块?据我所知,hackage 上的 HGL 包不是用 GHC >= 7 构建的。
  • 也许我对我指的是哪些库感到困惑?我按照说明让 SOEGraphics 工作here
  • 好的,这是一个相当新的来源,所以它应该工作。我不知道 SOE 代码已再次从 HGL 中移出,而您与 hugs 文档的链接(最后一次发布的 hugs 是 2006 年 9 月!)让我感到奇怪。不过,我不知道是什么原因导致挂起。是否可以缓冲,以便仅在按下&lt;enter&gt; 后发送按键? (不太可能,但我能提供的唯一猜测。)
  • 我发现了同样的问题,在查看文件 SOE.hs 后,我发现了一个问题:在第 488 和 489 行,“return ch”和“getKeyEx win False”这两个表达式应该被交换。确实,在更改之后,程序可以正常工作。希望这可能有任何价值。

标签: haskell graphics io


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    getKeyEx :: Window -&gt; Bool -&gt; IO Char

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

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

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

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

    【讨论】:

      【解决方案3】:

      Daniel 是正确的,但我发现 getKeyEx 工作时 getKey 只使用 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 即可工作。

      【讨论】:

      • 代码在“The Haskell School of Expression”源代码下载的SOE/src目录下的SOE.hs中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      相关资源
      最近更新 更多