2012-09-20 27 views
5

Actualmente estoy siguiendo los ejercicios en el libro: "The Haskell School of Expression" y he llegado al tercer capítulo sobre creación de gráficos. El libro usa el módulo SOEGraphics y muestra cómo dibujar un texto simple en una ventana y luego cerrarlo presionando un botón.Ventana de Haskell SOEGraphics no se cerrará

Sin embargo, cuando compilo y ejecuto, encuentro que aunque la ventana aparece con el texto en pantalla, la ventana se niega a cerrarse independientemente de qué teclas presione o si el foco está en la línea de comandos o en la ventana.

Aquí está el código fuente del libro:

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 
     ) 

La única manera de conseguir la ventana para cerrar es por lo que obligó a dejar de fumar con CTRL-C. ¿Hay algo que he pasado por alto con mi código? El programa se compiló usando GHC 7.4.1 y se ejecutó en Ubuntu.

+0

¿De dónde sacaste el módulo? El paquete HGL en hackage no se compila con GHC> = 7, por lo que puedo ver. –

+0

¿Quizás estoy confundido sobre a qué bibliotecas me refiero? Seguí las instrucciones para que SOEGraphics funcione [aquí] (http://www.cs.yale.edu/homes/hudak/SOE/software1.htm) –

+0

De acuerdo, es una fuente bastante reciente, por lo que debería funcionar.No sabía que el código SOE se había eliminado de HGL nuevamente, y su enlace a los documentos de abrazos (¡la última versión de los abrazos fue en septiembre de 2006!) Me hizo preguntarme. Aunque no sé lo que podría causar la caída. ¿Podría ser el almacenamiento en búfer, de modo que la pulsación de tecla solo se envíe después de presionar ''? (Improbable, pero la única suposición que puedo ofrecer.) –

Respuesta

2

Probar getKeyChar intead de getKey. Parece haber habido un cambio en el método preferido para usar y/o el comportamiento en ciertos sistemas operativos.

0

Estoy usando el current release del paquete SOE, que fue lanzado aproximadamente 9 meses antes de la fecha de la pregunta. Al igual que el póster de la pregunta, ejecuto GHCi 7.4.1 en Ubuntu (12.04). Me encontré con este mismo problema, pero la respuesta de DuckMaestro no se aplica:

getKeyChar no está definido en ninguno de los módulos del paquete SOE. Sin embargo, es getKeyEx:

Aunque indocumentado en el propio paquete de SOE, esta función parece emular a su namesake en el módulo Graphics.HGL.Utils.

Sin embargo, mientras que getKey se exporta desde el módulo SOE, getKeyEx no lo está.

Con el fin de recopilar y tener la ventana estrecha en un evento de pulsación de tecla

  1. exportan getKeyEx del módulo SOE
  2. en el código citado en la pregunta, cambió k <- getKey w a k <- getKeyEx w True
0

Daniel está en lo cierto, pero me pareció extraño que getKeyEx funcione cuando getKey, que simplemente usa getKeyEx, no funciona. Así que miré. El problema es bastante claro. Aquí está el código existente para getKey

getKey win = do 
    ch <- getKeyEx win True 
    if ch == '\x0' then return ch 
    else getKeyEx win False 

Esto es lo que debería ser

getKey win = do 
    ch <- getKeyEx win True 
    if ch /= '\x0' then return ch 
    else getKeyEx win False 

Hacer esta revisión y trabaja getKey.

+0

está en SOE.hs en el directorio SOE/src de la descarga del código fuente para "The Haskell School of Expression" –

Cuestiones relacionadas