2012-09-20 47 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」 –