miércoles, 7 de octubre de 2009

La ciencia en España no necesita tijeras



Hola a todos:

Como ya sabréis, los presupuestos españoles para el año 2010 contemplan una reducción muy importante del dinero destinado a la ciencia en España. Desde este humilde blog quiero unirme a la campaña lanzada por la aldea irreductible en contra de esta reducción de fondos.

lunes, 26 de enero de 2009

Primeros pasos con LTK (parte 4)

Hola de nuevo:

Hoy vamos a hablar sobre cómo hacer que nuestras aplicaciones en LTK respondan a estímulos del mundo exterior. Exacto! Vamos a hablar de la gestión de eventos.

Aquellos que no hayáis programado nunca una aplicación gráfica seguramente os estáis preguntando qué es esto de los eventos. Bien. Una aplicación gráfica normalmente no está haciendo cosas todo el tiempo, sino que se espera a que pase algo y en ese momento responde. Por ejemplo, al hacer click en el botón "actualizar", firefox actualizará la página web que estáis viendo en este momento. Antes de pulsar el botón, firefox no está haciendo nada. Cuando pulsáis el botón, la librería gráfica le dice a firefox "oye, que el chaval este ha pulsao un botón, haz algo" y firefox responde desperezándose y renovando la página. Ese algo que ha provocado la reacción del programa ( en nuestro caso, la pulsación de un botón ) se llama evento. Podríamos decir que un esquema bastante general de una aplicación gráfica sería el siguiente:
  1. La aplicación arranca.
  2. La aplicación se queda esperando que suceda un evento.
  3. Sucede un evento. La aplicación actúa según qué evento sea.
  4. Una vez finalizada la respuesta al evento, la aplicación vuelve a esperar que suceda un nuevo evento.
  5. ...
  6. Sucede algo que hace que la aplicación decida terminar.
Hoy aprenderemos a gestionar algunos eventos básicos en nuestras aplicaciones.

La función bind

La manera que tiene LTK de gestionar eventos es particularmente simple. Lo que hacemos es vincular un evento con un determinado widget y una función, de manera que cuando ese evento le suceda a ese widget será esa la función que se ejecute. En algunos toolkits gráficos lo que se envía es un evento junto con el widget que lo ha provocado y nos las tenemos que apañar para decidir cómo actuar. Afortunadamente, en LTK esto no es así ( como en la mayoría de toolkits gráficos actuales, tendría que añadir. Aquellos malos tiempos ya pasaron, a no ser que queráis hacer algo de muy bajo nivel ).

La manera de hacer lo que hemos dicho es mediante la función bind. Su formato es el siguiente:

(bind widget nombreEvento FuncionAEjecutar )

Por ejemplo, vamos a hacer que al hacer click sobre una etiqueta se ejecute una función, de forma que imitaremos un botón. Sí, bueno, ya tenemos botones, pero recordad que estamos aprendiendo, así que empezaremos por algo sencillo.

NOTA: los nombres de los eventos se deben cerrar entre <>. Por alguna extraña razón, blogger no me deja.

Un trozo de código lisp que nos crearía la interfaz sería


(use-package :ltk )


(with-ltk ()
(let
(
(etiqueta (make-instance 'label :master nil :text "Etiqueta" ))
)
(pack etiqueta )
)
)

Ahora simplemente vamos a añadir una línea para que la etiqueta muestre por pantalla "Hola" cuando le hagamos click encima. Esta línea sería la siguiente:

(bind etiqueta "Button-1" (lambda (x) (print 'hola )))

Los eventos en LTK se nombran mediante cadenas de texto. Por ejemplo, "" identifica la pulsación del botón izquierdo del ratón. Hay muchos otros eventos, y además se admiten abreviaciones. La función que asignamos necesita un argumento porque se le pasa un objeto de tipo evento que en este ejemplo no necesitamos usar. Nuestro código final sería, pues:

(use-package :ltk )


(with-ltk ()
(let
(
(etiqueta (make-instance 'label :master nil :text "Etiqueta" ))
)
(bind etiqueta "Button-1" (lambda (x) (print 'hola )))
(pack etiqueta )
)
)

Podemos ver el resultado de pulsar 3 veces encima de la etiqueta:

Ahora pasaremos a ver cómo conseguir que los widgets cambien de color en cuanto les pasamos el ratón por encima. Así podemos consiguir efectos muy bonitos si elegimos los colores con gusto. Hay otras formas más sencillas de hacerlo, pero nos vamos a olvidar de ellas. Probad el siguiente ejemplo:

(with-ltk ()
(let
(
(etiqueta (make-instance 'label :master nil :text "Etiqueta" :background "gray" ))
)
(bind etiqueta "Enter" (lambda (x) (configure etiqueta :background "green" )))
(bind etiqueta "Leave" (lambda (x) (configure etiqueta :background "gray" )))
(pack etiqueta )
)
)

Es sencillo entenderlo. Simplemente creamos una etiqueta con el fondo gris, usando la opción background. Entonces le asociamos dos eventos:
  1. Cuando el ratón entre al widget, reconfiguramos la etiqueta para que tenga el fondo verde.
  2. Cuando el ratón se retire de la etiqueta, la reconfiguramos para que vuelva a tener el fondo gris.
De esta forma conseguimos el efecto de destacar la etiqueta. Desgraciadamente no tengo buen gusto para los colores :-)


Os dejo un enlace a un tutorial de la Universidad de Oviedo dónde podéis encontrar una lista con algunos eventos y algo más de información sobre ellos:

http://www6.uniovi.es/tcl/tutorial/cap12.html

Por hoy ya tenemos suficiente.

He de pediros disculpas por no haber escrito nada durante mucho tiempo. He tenido que examinarme del máster y no he podido hacer nada más, pero espero poder escribir más a menudo a partir de ahora.

Nos vemos!

PD: me gustaría programar un pequeño juego en ltk como programa final, para cuando haya acabado el curso. Si queréis proponerme algo, escribidlo como comentario en esta entrada. Yo había pensando en un tres en ralla, un buscaminas o algo similar. Pensad que debe ser algo que se pueda explicar en un máximo de 2 o 3 posts. Agradeceré vuestras sugerencias.