Capítulo 9. Miscelánea de Controles

Tabla de contenidos

9.1. Etiquetas
9.2. Flechas (Arrow)
9.3. El Objeto Pistas (Tooltip)
9.4. Barras de Progreso (ProgressBar)
9.5. Diálogos
9.6. Imágenes
9.6.1. Pixmaps
9.7. Reglas
9.8. Barras de Estado
9.9. Entradas de Texto (Entry)
9.10. Botones Aumentar/Disminuir
9.11. Lista Desplegable (Combo)
9.12. Calendario
9.13. Selección de Color
9.14. Selectores de Fichero
9.15. Diálogo de Selección de Fuentes

9.1. Etiquetas

Las etiquetas son objetos de la clase Label y se usan mucho en GTK, siendo además relativamente simples. Los objetos Label no emiten señales ya que no tienen una ventana X asociada. Si se necesita capturar señales, o hacer recorte, se deben colocar dentro de un control EventBox (Caja de Eventos) o de un control Button (Botón).

Para crear una nueva etiqueta se usa:

  label = gtk.Label(str)

El único argumento es la cadena de texto que se quiere que visualice la etiqueta. Para cambiar el texto de la etiqueta después de la creación se usa el método:

  label.set_text(str)

label es la etiqueta que se creó previamente, y str es la nueva cadena. El espacio que necesite la nueva cadena se ajustará automáticamente si es necesario. Se pueden hacer etiquetas multilinea poniendo saltos de linea en la cadena de la etiqueta.

Para obtener la cadena actual, se usa:

  str = label.get_text()

label es la etiqueta que se ha creado, y str es la cadena que devuelve. El texto de una etiqueta en label se puede justificar usando:

  label.set_justify(jtype)

Los valores posibles de jtype son:

  JUSTIFY_LEFT # valor predeterminado
  JUSTIFY_RIGHT
  JUSTIFY_CENTER
  JUSTIFY_FILL # no funciona

El control de etiqueta también es capaz de partir el texto automáticamente. Esto se puede activar usando:

  label.set_line_wrap(wrap)

El argumento wrap puede tomar un valor TRUE o FALSE.

Si se quiere subrayado en la etiqueta, entonces se puede establecer un patrón para la etiqueta:

  label.set_pattern(pattern)

El argumento pattern (patrón) indica cómo se verá el subrayadao. Consiste en una cadena de signos de subrayado y caracteres de espacio. Un signo de subrayado indica que el caracter correspondiente en la etiqueta debe estar subrayado. Por ejemplo, la cadena "__ __" subrayaría los primeros dos caracteres y los caracteres cuarto y quinto. Si sólo se quiere un atajo subrayado ("mnemónico") en la etiqueta, se debería usar set_text_with_mnemonic (str), no set_pattern().

El programa de ejemplo label.py es un ejemplo corto para ilustrar estos métodos. Este ejemplo hace uso del control Frame (Marco) para demostrar mejor los estilos de etiqueta. Se puede ignorar esto por ahora ya que el control Frame (Marco) se explica después.

En GTK+ 2.0, el texto de la etiqueta puede contener marcas para el tipo de letra y otros atributos del texto, y las etiquetas pueden ser seleccionables (para copiar y pegar). Estas características avanzadas no se explican aqui.

La figura Figura 9.1, “Ejemplos de Etiquetas” ilustra el resultado de ejecutar el programa de ejemplo:

Figura 9.1. Ejemplos de Etiquetas

Ejemplos de Etiquetas

El código fuente de label.py es:

    1	#!/usr/bin/env python
    2	
    3	# ejemplo label.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class Labels:
   10	    def __init__(self):
   11	        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   12	        self.window.connect("destroy", lambda w: gtk.main_quit())
   13	
   14	        self.window.set_title("Label")
   15	        vbox = gtk.VBox(gtk.FALSE, 5)
   16	        hbox = gtk.HBox(gtk.FALSE, 5)
   17	        self.window.add(hbox)
   18	        hbox.pack_start(vbox, gtk.FALSE, gtk.FALSE, 0)
   19	        self.window.set_border_width(5)
   20	
   21	        frame = gtk.Frame("Normal Label")
   22	        label = gtk.Label("This is a Normal label")
   23	        frame.add(label)
   24	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   25	  
   26	        frame = gtk.Frame("Multi-line Label")
   27	        label = gtk.Label("This is a Multi-line label.\nSecond line\n"
   28	                             "Third line")
   29	        frame.add(label)
   30	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   31	  
   32	        frame = gtk.Frame("Left Justified Label")
   33	        label = gtk.Label("This is a Left-Justified\n"
   34	                             "Multi-line label.\nThird      line")
   35	        label.set_justify(gtk.JUSTIFY_LEFT)
   36	        frame.add(label)
   37	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   38	  
   39	        frame = gtk.Frame("Right Justified Label")
   40	        label = gtk.Label("This is a Right-Justified\nMulti-line label.\n"
   41	                             "Fourth line, (j/k)")
   42	        label.set_justify(gtk.JUSTIFY_RIGHT)
   43	        frame.add(label)
   44	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   45	
   46	        vbox = gtk.VBox(gtk.FALSE, 5)
   47	        hbox.pack_start(vbox, gtk.FALSE, gtk.FALSE, 0)
   48	        frame = gtk.Frame("Line wrapped label")
   49	        label = gtk.Label("This is an example of a line-wrapped label.  It "
   50	                             "should not be taking up the entire             "
   51	                             "width allocated to it, but automatically "
   52	                             "wraps the words to fit.  "
   53	                             "The time has come, for all good men, to come to "
   54	                             "the aid of their party.  "
   55	                             "The sixth sheik's six sheep's sick.\n"
   56	                             "     It supports multiple paragraphs correctly, "
   57	                             "and  correctly   adds "
   58	                             "many          extra  spaces. ")
   59	        label.set_line_wrap(gtk.TRUE)
   60	        frame.add(label)
   61	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   62	  
   63	        frame = gtk.Frame("Filled, wrapped label")
   64	        label = gtk.Label("This is an example of a line-wrapped, filled label.  "
   65	                             "It should be taking "
   66	                             "up the entire              width allocated to it.  "
   67	                             "Here is a sentence to prove "
   68	                             "my point.  Here is another sentence. "
   69	                             "Here comes the sun, do de do de do.\n"
   70	                             "    This is a new paragraph.\n"
   71	                             "    This is another newer, longer, better "
   72	                             "paragraph.  It is coming to an end, "
   73	                             "unfortunately.")
   74	        label.set_justify(gtk.JUSTIFY_FILL)
   75	        label.set_line_wrap(gtk.TRUE)
   76	        frame.add(label)
   77	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   78	  
   79	        frame = gtk.Frame("Underlined label")
   80	        label = gtk.Label("This label is underlined!\n"
   81	                             "This one is underlined in quite a funky fashion")
   82	        label.set_justify(gtk.JUSTIFY_LEFT)
   83	        label.set_pattern(
   84	            "_________________________ _ _________ _ ______     __ _______ ___")
   85	        frame.add(label)
   86	        vbox.pack_start(frame, gtk.FALSE, gtk.FALSE, 0)
   87	        self.window.show_all ()
   88	
   89	def main():
   90	    gtk.main()
   91	    return 0
   92	
   93	if __name__ == "__main__":
   94	    Labels()
   95	    main()

Obsérvese que la etiqueta "Filled, wrapped label" no tiene justificación completa (fill justified).