我目前正在按照书中的练习:“哈斯克尔表达学校”进行第三章创建图形。本书使用SOEGraphics模块,演示在窗口中绘制一些简单文本,然后按下按钮关闭它。
然而,在编译和执行之后,我发现尽管窗口出现了屏幕上的文本,但无论我按哪个键或者焦点是在命令行还是窗口本身,窗口都会拒绝关闭。 / p>
以下是本书的源代码:
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 :(得分:2)
托盘getKeyChar
代替getKey
。在某些OSsp中使用和/或行为的首选方法似乎发生了变化
答案 1 :(得分:0)
我正在使用SOE软件包的current release,该软件包在问题发布前约9个月发布。就像问题的海报一样,我在Ubuntu(12.04)上运行GHCi 7.4.1。我遇到了同样的问题,但DuckMaestro的答案并不适用:
getKeyChar
未在SOE包中的任何模块中定义。但是,getKeyEx
是:
getKeyEx :: Window -> Bool -> IO Char
虽然在SOE包本身没有记录,但此函数似乎模拟Graphics.HGL.Utils
模块中的namesake。
但是,虽然getKey
是从SOE模块导出的,但getKeyEx
却不是。{/ p>
为了编译并关闭按键事件窗口
getKeyEx
k <- getKey w
更改为k <- getKeyEx w True
答案 2 :(得分:0)
Daniel是正确的,但我发现当getKey只使用getKeyEx时,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正常工作。