9.11. Lista Desplegable (Combo)

Nota

El control de Lista Desplegable Combo está obsoleto a partir de la versión 2.4 de PyGTK.

La lista desplegable Combo es otro control bastante simple que es realmente una colección de otros controles. Desde el punto de vista del usuario, el control consiste en una caja de entrada de texto y un menú desplegable desde el que se puede seleccionar una entrada a partir de un conjunto predefinido. Alternativamente, el usuario puede escribir una opción diferente directamente en la caja de texto.

El Combo tiene dos partes principales de las que preocuparse: una entry (entrada) y una list (lista). Se puede acceder a ellas usando los atributos:

  combo.entry

  combo.list

Lo primero, para crear una lista desplegable, se usa:

  combo = gtk.Combo()

Ahora, si se quiere fijar la cadena en la sección de la entrada de la lista desplegable, esto se hace manipulando el control entrada directamente:

  combo.entry.set_text(text)

Para fijar los valores de la lista desplegable, se usa el método:

  combo.set_popdown_strings(strings)

Antes de que se pueda hacer esto, hay que componer una lista con las opciones que se deseen.

Aqui tenemos el típico código para crear un conjunto de opciones:

  slist = [ "String 1", "String 2", "String 3", "String 4" ]

  combo.set_popdown_strings(slist)

En este punto ya se tiene una lista desplegable funcionando. Hay unos cuantos aspectos de su comportamiento que se pueden cambiar. Esto se consigue con los métodos:

  combo.set_use_arrows(val)

  combo.set_use_arrows_always(val)

  combo.set_case_sensitive(val)

El método set_use_arrows() permite al usuario cambiar el valor de la entrada usando las teclas de flecha arriba/abajo cuando val se pone a TRUE. Esto no despliega la lista, si no que sustituye el texto actual de la entrada con la siguiente entrada de la lista (arriba o abajo, según la combinación de tecla indique). Esto se hace buscando en la lista el elemento correspondiente al valor actual de la entrada y seleccionando el elemento anterior/siguiente correspondiente. Normalmente en una entrada las teclas de flecha se usan para cambiar el foco (también puedes hacer esto usando el tabulador). Ten en cuenta que cuando el elemento actual es el último de la lista y pulsas la tecla flecha abajo se cambia el foco (lo mismo ocurre cuando estas en el primer elemento y pulsas la tecla flecha arriba).

Si el valor actual de la entrada no está en la lista, el método set_use_arrows() se desactiva.

El método set_use_arrows_always() , cuando val es TRUE, también permite al usuario el uso de las teclas de flecha arriba/abajo para ciclar por las opciones de la lista desplegable, excepto que da la vuelta a los valores de la lista, desactivando por completo el uso de las flechas arriba y abajo para cambiar el foco.

El método set_case_sensitive() dice si GTK busca o no las entradas de una forma sensible a mayúsculas. Esto se usa cuando se le pide al control Combo que busque un valor de la lista usando la entrada actual de la caja de texto. Este completado puede producirse de forma sensible o insensible a mayúsculas, dependiendo de lo que le pasemos a este método. El control Combo también puede simplemente completar la entrada actual si el usuario pulsa la combinación de teclas MOD-1+Tab. MOD-1 normalmente corresponde a la tecla Alt, gracias a la utilidad xmodmap. Ten en cuenta, sin embargo, que algunos manejadores de ventana también usan esta combinación de teclas, lo que inutilizará su uso en GTK.

Ahora que tenemos una lista desplegable, y que tiene la apariencia y el comportamiento que queremos, lo único que nos falta es la capacidad de obtener los datos de la lista desplegable. Esto es relativamente directo. La mayoría del tiempo, de lo único que en necesario preocuparse es de obtener los datos de la entrada. La entrada es accesible simplemente como combo.entry. Las dos cosas fundamentales que se querrán hacer con ella es conectarle la señal "activate", que indica que el usuario ha pulsado la tecla Return o la tecla Enter, y leer el texto. Lo primero se consigue usando algo como:

  combo.entry.connect("activate", my_callback, my_data)

Obtener el texto en cualquier momento se consigue simplemente usando el siguiente método:

  string = combo.entry.get_text()

Eso es todo lo importante. Hay un método:

  combo.disable_activate()

que desactivará la señal "activate" en el control de entrada de la lista desplegable. Personalmente, no se me ocurre ninguna situación en la que se quiera usar, pero existe.