miércoles, 5 de noviembre de 2008

Primeros pasos con LTK (parte 2)

Hola!

Hoy vamos a seguir con la introducción a LTK que iniciamos hace unos días.

Empezaremos por comentar el ejemplo que ya vimos y que nos mostraba "Hola, mundo" en una etiqueta:

(use-package :ltk )
(with-ltk ()
(let
(
( etiqueta (make-instance 'label :master nil :text "Hola, mundo" ))
)
(pack etiqueta)
)
)

Bien. La primera línea es conocida: (use-package :ltk) simplemente importa los símbolos que necesitamos, para no tener que escribir todo el rato ltk:laFuncionQueNosInteresa.

Es en la segunda línea donde empezamos a usar ltk. La macro with-ltk inicializa la librería y ejecuta todo el código que metemos en su cuerpo. Tiene unos parámetros opcionales ( en nuestro caso, la lista vacía --()-- ) que nos permiten controlar ciertas opciones de debug.

Cada tipo de widget en ltk se representa mediante una clase. Por eso, cuando llamamos a make-instance 'label estamos creando una etiqueta. Todos los widgets de ltk tienen unas opciones de inicialización comunes:
  • master : el widget padre. Si lo dejamos a nil, ltk tomará a este widget como del nivel padre
Pack es lo que se llama un "package manager", o gestor de empaquetado. Es la función que usamos cuando queremos situar un widget sobre la pantalla, y se encarga de tareas como su posición relativa a otros widgets y (en ocasiones) su tamaño. Existen varios package managers, pero pack es el más utilizado, así que será el que comentaremos aquí. Si queréis saber más sobre el resto de managers, una forma fácil de empezar es man grid o man place.

Cuando trabajamos con pack lo que hacemos es situar los widgets en cajas. Podemos elegir si situaremos estas cajas de arriba a abajo ( por defecto en pack ), de abajo a arriba, de izquierda a derecha o de derecha a izquierda. También nos permite elegir si queremos que el widget se vea elevado sobre la caja, hundido o de diversas formas.

El widget label ( la etiqueta )

El widget label es uno de los más básicos y sencillos de utilizar. Simplemente es una etiqueta donde podemos mostrar texto.

La forma más común de crear un label es mediante

(make-instance 'label :master suPadre :text "SuTexto" )

Esto ajustará automáticamente el tamaño de la etiqueta al del texto que contiene.

A veces resulta muy conveniente, a fin de realizar interfaces más bonitas, controlar el ancho de las etiquetas para que todas tengan el mismo tamaño. Esto se hace mediante la opción de inicialización :width suAncho , dónde suAncho es un entero. El ancho de un label se mide en carácteres, por tanto :width 10 significará que queremos una etiqueta con un ancho de 10 carácteres.

Evidentemente, hay muchas más opciones interesantes para los label. man label para verlas.

El widget button ( el botón )

El widget button ofrece lo que promete: un botón. Su inicialización es muy similar a la del widget label, excepto por el hecho de que nos deja proporcionarle un argumento command que es la función que ejecutará cuando sea pulsado.

(make-instance 'button :master nil :text "Pulsame"
:command ( lambda ()
(format t "Has pulsado el boton~%" )
)

A ver si imagináis que hace el código anterior.

2 comentarios:

Unknown dijo...

Hola, antes que nada quería darte las gracias porque, gracias a este blog, he conocido ltk y he empezado a usarlo.

Tengo un problema con ltk. Me gustaría mostrar una lista de items en pantalla y que el usuario pueda elegir uno de ellos mediante el ratón. Supongo que el widget que hace esto es el listbox (por el nombre), así que he hecho un ejemplo pero no me funciona. Este es el código que utilizo para crearlo (parecido al del boton):

[...]

(lb-lista-items (make-listbox :master f :listvariable lista-items))

[...]

El caso es que no me pinta el listbox.
¿Tienes alguna idea de cual puede ser el problema?

Gracias.

SpanishLisper dijo...

Hola, Abel:

Estas en lo cierto respecto a que el listbox es el widget adecuado. El problema es que el parámetro listvariable no hace lo que se supone que debería hacer por su nombre, sino que es un parámetro interno usado por la librería para controlar wish.

La manera correcta de añadir items a un listbox es usando la función (listbox-append miListBox lista ) . A continuación te dejo un pequeño ejemplo que he probado en Windows + Clisp y a mí me funciona:

(with-ltk ()
(let*
(
(padre (make-instance 'frame :master nil ))

(lb-lista-items (make-instance 'listbox :master padre ))
)
(pack padre)
(listbox-append lb-lista-items (list "Blanco" "Verde" "Azul" ))
(pack lb-lista-items )
)
)

Perdona el horrible formato, pero los comentarios no dan para más.

Espero haberte ayudado.