2012-09-20 48 views
5

我目前正在遵循书中的练习:“Haskell学院的表达”,并已经达成了关于创建图形的第三章。本书使用SOEGraphics模块,演示在窗口中绘制一些简单的文本,然后按下按钮关闭它。但是,在编译和执行后,我发现尽管窗口出现在屏幕上,但无论我按哪个键或焦点是在命令行还是窗口本身,窗口都会拒绝关闭。Haskell 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上运行。

+0

你从哪里得到模块?据我所知,HGL包装上的hackage不会以GHC> = 7构建。 –

+0

也许我对我指的是哪些库感到困惑?我按照说明让SOEGraphics工作[这里](http://www.cs.yale.edu/homes/hudak/SOE/software1.htm) –

+0

好的,这是一个相当新的来源,所以它应该工作。我不知道SOE代码已经被移出了HGL,并且你与拥抱文档的链接(最后一次发布是2006年9月!)让我感到惊讶。不过,我不知道会发生什么事情。它可以缓冲,所以只有按下''后才能发送按键? (不太可能,但我可以提供的唯一猜测。) –

回答

2

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

0

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

getKeyChar没有在SOE包中的任何模块中定义。然而,getKeyEx是:

虽然无证在SOE封装本身,这个功能似乎效仿其namesakeGraphics.HGL.Utils模块。

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

为了编译和关闭在按键事件

  1. 有窗口在问题所引用的代码出口getKeyEx从SOE模块
  2. ,改变k <- getKey wk <- getKeyEx w True
0

丹尼尔是正确的,但我发现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工作。

+0

代码位于SOE/src目录下的SOE.hs中,代码为“The Haskell School of Expression” –