9.9. Entradas de Texto (Entry)

El control Entry (Entrada) permite escribir texto y mostrarlo en una caja de texto con una única línea. El texto puede fijarse con llamadas a métodos que permiten que nuevo texto reemplace, se inserte antes o se añada después del contenido actual del control Entry .

La función para crear un control Entry es:

  entry = gtk.Entry(max=0)

Si el argumento max se especifica se establece un límite de longitud del texto dentro de la Entry. Si max es 0 no hay límite.

La longitud máxima de una entrada puede cambiarse usando el método:

  entry.set_max_length(max)

El siguiente método altera el texto que hay actualmente en el control Entry .

  entry.set_text(text)

El método set_text() fija el contenido del control Entry a text, remplazando el contenido actual. Obsérvese que la clase Entry implementa la interfaz Editable (sí, gobject soporta interfaces al estilo de Java) que contiene algunas funciones más para manipular los contenidos. Por ejemplo, el método:

  entry.insert_text(text, position=0)

inserta text en la posición indicada dentro de la entry.

El contenido de la Entry puede recuperarse usando una llamada al siguiente método. Esto es útil en las retrollamadas que se describen más abajo.

  text = entry.get_text()

Si no queremos que el contenido de la Entry sea modificada por alguien escribiendo en ella, podemos cambiar su estado de edición.

  entry.set_editable(is_editable)

El método anterior permite intercambiar el estado de edición del control Entry pasándole un valor TRUE o FALSE en el argumento is_editable.

Si estamos usando el control Entry y no queremos que el texto que se introduzca sea visible, por ejemplo cuando una contraseña se escribe, podemos usar el siguiente método, que además acepta una bandera booleana.

  entry.set_visibility(visible)

Una región del texto se puede poner como seleccionada usando el siguiente método. Esto se usaría sobre todo cuando se ponga algún valor predeterminado en un Entry, haciendo fácil para el usuario el borrado.

  entry.select_region(start, end)

Si queremos recibir notificación cuando el usuario introduzca el texto, podemos conectar a las señales "activate" o "changed". La primera se produce cuando el usuario pulsa la tecla enter dentro del control Entry. La segunda se produce cuando ocurre cualquier cambio en el texto, por ejemplo, para cualquier inserción o borrado de un caracter.

El programa de ejemplo entry.py muestra el uso de un control Entry . La figura Figura 9.10, “Ejemplo de Entrada” muestra el resultado de ejecutar el programa:

Figura 9.10. Ejemplo de Entrada

Ejemplo de Entrada

El código fuente entry.py es:

    1	#!/usr/bin/env python
    2	
    3	# ejemplo entry.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class EntryExample:
   10	    def enter_callback(self, widget, entry):
   11	        entry_text = entry.get_text()
   12	        print "Entry contents: %s\n" % entry_text
   13	
   14	    def entry_toggle_editable(self, checkbutton, entry):
   15	        entry.set_editable(checkbutton.get_active())
   16	
   17	    def entry_toggle_visibility(self, checkbutton, entry):
   18	        entry.set_visibility(checkbutton.get_active())
   19	
   20	    def __init__(self):
   21	        # create a new window
   22	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   23	        window.set_size_request(200, 100)
   24	        window.set_title("GTK Entry")
   25	        window.connect("delete_event", lambda w,e: gtk.main_quit())
   26	
   27	        vbox = gtk.VBox(gtk.FALSE, 0)
   28	        window.add(vbox)
   29	        vbox.show()
   30	
   31	        entry = gtk.Entry()
   32	        entry.set_max_length(50)
   33	        entry.connect("activate", self.enter_callback, entry)
   34	        entry.set_text("hello")
   35	        entry.insert_text(" world", len(entry.get_text()))
   36	        entry.select_region(0, len(entry.get_text()))
   37	        vbox.pack_start(entry, gtk.TRUE, gtk.TRUE, 0)
   38	        entry.show()
   39	
   40	        hbox = gtk.HBox(gtk.FALSE, 0)
   41	        vbox.add(hbox)
   42	        hbox.show()
   43	                                  
   44	        check = gtk.CheckButton("Editable")
   45	        hbox.pack_start(check, gtk.TRUE, gtk.TRUE, 0)
   46	        check.connect("toggled", self.entry_toggle_editable, entry)
   47	        check.set_active(gtk.TRUE)
   48	        check.show()
   49	    
   50	        check = gtk.CheckButton("Visible")
   51	        hbox.pack_start(check, gtk.TRUE, gtk.TRUE, 0)
   52	        check.connect("toggled", self.entry_toggle_visibility, entry)
   53	        check.set_active(gtk.TRUE)
   54	        check.show()
   55	                                   
   56	        button = gtk.Button(stock=gtk.STOCK_CLOSE)
   57	        button.connect("clicked", lambda w: gtk.main_quit())
   58	        vbox.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   59	        button.set_flags(gtk.CAN_DEFAULT)
   60	        button.grab_default()
   61	        button.show()
   62	        window.show()
   63	
   64	def main():
   65	    gtk.main()
   66	    return 0
   67	
   68	if __name__ == "__main__":
   69	    EntryExample()
   70	    main()