martes, 7 de enero de 2014

Tutorial python gtk3 Entry

En esta ocasión vamos a aprender a usar cajas de entrada de texto usando Python + Gtk. Los entry se usan para introducir texto,o mostrar texto en forma muy corta.

Para crear un entry se crea un objeto de la clase Gtk.Entry(),los cuales pueden tener algunos parámetros,funciones para hacer un entry mas customizado y funcional:

self.entry = Gtk.Entry()

Este es un entry muy muy básico:




1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# -*- coding: latin-1 -*-
from gi.repository import Gtk, GObject

class Ejemplo(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Ejemplo entry")
        self.set_size_request(200, 100)
        self.entry = Gtk.Entry()
        self.add(self.entry)
       
ventana = Ejemplo()
ventana.connect("delete-event", Gtk.main_quit)
ventana.show_all()
Gtk.main()

Ahora vamos a ver algunas funciones:

Añadir texto al crearlo:

Para añadir texto vamos a usar el argumento explicito text,al crearlo:

self.entry = Gtk.Entry(text="Hola Mundo!!")

 Si se desea colocar texto en el entry aun cuando ya esta creado el objeto,podemos usar la función set_text("texto"):

self.entry.set_text("Hola Mundo!!")

De igual manera tenemos una función opuesta que llama el texto que se haya introducido :

self.entry.get_text()

Ejemplo de intercambiar texto de un entry a otro:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# -*- coding: latin-1 -*-

from gi.repository import Gtk, GObject

class Ejemplo(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Ejemplo entry")
        self.set_size_request(200, 100)
        self.pos = [Gtk.Orientation.HORIZONTAL,Gtk.Orientation.VERTICAL]
        self.vbox = Gtk.Box()
        self.vbox.set_spacing(1)
        self.vbox.set_orientation(self.pos[1])
        
        self.entry = Gtk.Entry(text="Hola Mundo!!") # Inicia con el texto "Hola Mundo!!"
        self.vbox.pack_start(self.entry,True,False,1) # Lo añadimos al box
        
        self.button = Gtk.Button(label="Cambiar")  # Añadimos un boton
        self.vbox.pack_start(self.button,True,False,1)
        self.button.connect("clicked", self.cambiar) # Si el boton se cliquea vamos a la  funcion cambiar
        self.entry2 = Gtk.Entry()
        self.vbox.pack_start(self.entry2,True,False,1)
        
        self.add(self.vbox)
    def cambiar(self,widget):
        texto = self.entry.get_text() # El texto es igual al get_text() del entry1
        self.entry2.set_text(texto) # Ponemos el texto del entry1 en el entry2
        
ventana = Ejemplo()
ventana.connect("delete-event", Gtk.main_quit)
ventana.show_all()
Gtk.main()


También contamos con funciones para esconder el texto ingresado:

Para ello solo usamos la función set_visibility(bool) con un valor booleano,en este caso False:

self.entry.set_visibility(False)

Ejemplo de login:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from gi.repository import Gtk, GObject

class Ejemplo(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Ejemplo entry")
        self.set_size_request(200, 100)
        self.pos = [Gtk.Orientation.HORIZONTAL,Gtk.Orientation.VERTICAL]
        self.vbox = Gtk.Box()
        self.vbox.set_spacing(1)
        self.vbox.set_orientation(self.pos[1])
        
        self.entry = Gtk.Entry()
        self.vbox.pack_start(self.entry,True,False,1)

        self.entry2 = Gtk.Entry()
        self.entry2.set_visibility(False)
        self.vbox.pack_start(self.entry2,True,False,1)
        
        self.button = Gtk.Button(label="Login")   
        self.button.connect("clicked", self.login)     
        self.vbox.pack_start(self.button,True,False,1)
        
        self.add(self.vbox)
    
    def login(self,widget):
        user = self.entry.get_text()
        password = self.entry2.get_text()
        if (user == "Gtk" and password == "Gtk"):
            print "Login correcto"
        else:
            print "Login incorrecto"
        
        
ventana = Ejemplo()
ventana.connect("delete-event", Gtk.main_quit)
ventana.show_all()
Gtk.main()


En ese mismo ejemplo podemos usar algo que se usan en muchos logins,asignar un máximo de letras al usar el entry:

self.entry.set_max_length(numero_de_letras)

Tambien en el ejemplo de arriba si quisieramos indicar de que o para que sirve el entry podemos usar un placeholder,esto para que nos muestre de que sirve sin añadir un widget extra y que no estorbe en funcionalidad:

self.entry.set_placeholder_text("Texto")



Si quisiéramos hacer que el testo mostrado,por ejemplo desde el principio (como se ve arriba) fuera inmutable,podemos usar set_editable(), al cual le pasamos como argumento un bool,para ver si se podrá editar:

self.entry.set_editable(False) # Evita cambio

Si queremos que nuestro entry nos autocomplete podemos usar un EntryCompletion,esto lo veremos cuando veamos los Liststore,pero de momento pueden ver esta función que crea un EntryCompletion:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def set_completation(self):
       sistemas = [
        "Ubuntu","Arch","Gentoo","Debian","Mint","openSUSE",
        ]
        liststore = Gtk.ListStore(str)
        for sistema in sistemas:
           liststore.append([sistema])

        completion = Gtk.EntryCompletion()
        completion.set_model(liststore)
        completion.set_text_column(0)
        return completion
        

Esa función devuelve una EntryCompletion ahora solo tenemos que asignarla al entry,con la funcion

self.entry.set_completion(self.set_completation())

Este es un ejemplo que pregunta que distribución de Linux usas:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from gi.repository import Gtk, GObject

class Ejemplo(Gtk.Window):
   
    def __init__(self):
        Gtk.Window.__init__(self, title="Ejemplo entry")
        self.set_size_request(200, 100)
        self.pos = [Gtk.Orientation.HORIZONTAL,Gtk.Orientation.VERTICAL]
        
        self.vbox = Gtk.Box()
        self.vbox.set_spacing(1)
        self.vbox.set_orientation(self.pos[1])
        
        self.entry = Gtk.Entry()
        self.entry.set_placeholder_text("Que sistema Linux usas?")
        self.entry.set_completion(self.set_completation())

        self.vbox.pack_start(self.entry,True,False,1)
        
        self.button = Gtk.Button(label="Aceptar")   
        self.button.connect("clicked", self.uso)     
        self.vbox.pack_start(self.button,True,False,1)
        
        self.add(self.vbox)
        
    def set_completation(self):
        sistemas = [
        "Ubuntu","Arch","Gentoo","Debian","Mint","openSUSE",
        ]
        liststore = Gtk.ListStore(str)
        for sistema in sistemas:
           liststore.append([sistema])

        completion = Gtk.EntryCompletion()
        completion.set_model(liststore)
        completion.set_text_column(0)
        return completion
        
    def uso(self,widget):
        if self.entry.get_text() != "":
         print "Uso %s" %(self.entry.get_text())
        


ventana = Ejemplo()
ventana.connect("delete-event", Gtk.main_quit)
ventana.show_all()
Gtk.main()


Si quisiéramos que hubiera un boton en el mismo entry para no usar uno ajeno haríamos esto:

Primero añadimos un icono,por ejemplo uno de los stocks :



self.entry.set_icon_from_stock(icon_pos,stock)

En stock añadimos uno de los siguientes:

Enlace 

Y en icon_pos,podemos usar:

Gtk.EntryIconPosition.SECONDARY # Derecha

Gtk.EntryIconPosition.PRIMARY # Izquierda

Ahora nos quedaría así,un boton para limpiar el texto(borrar el texto del entry):

self.entry.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY,Gtk.STOCK_CLEAR)

Con eso añadiríamos el boton,pero ahora hay que definir la función,para ellor tendriamos que añadir la señal de icono presionado:

self.entry.connect("icon-press",self.limpiar,None)

El primer argumento es el tipo de señal,el segundo la función a llamar,y el tercero es algún parámetro extra.

Por ultimo podemos añadir un tooltip al boton del entry para que nos diga por ejemplo en este ejemplo que es lo que hace,en este caso borrar el texto,par ello solo debemos llamar la función set_icon_tooltip_text, y pasarle rn el primer parametro la posision(igual que arriba) y en el segundo el tooltip:


 self.entry.set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, "Borrar texto")
Ejemplo completo:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# -*- coding: latin-1  -*-

from gi.repository import Gtk, GObject

class Ejemplo(Gtk.Window):
   
    def __init__(self):
        Gtk.Window.__init__(self, title="Ejemplo entry")
        self.set_size_request(200, 100)
        self.pos = [Gtk.Orientation.HORIZONTAL,Gtk.Orientation.VERTICAL]
        
        self.vbox = Gtk.Box()
        self.vbox.set_spacing(1)
        self.vbox.set_orientation(self.pos[1])
        
        self.entry = Gtk.Entry()
        self.entry.set_placeholder_text("Que sistema Linux usas?")
        self.entry.set_completion(self.set_completation())
        self.entry.set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, "Borrar texto")
        self.entry.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY,Gtk.STOCK_CLEAR)
        self.entry.connect("icon-press",self.limpiar,None)
        self.vbox.pack_start(self.entry,True,False,1)
        
        self.button = Gtk.Button(label="Aceptar")   
        self.button.connect("clicked", self.uso)     
        self.vbox.pack_start(self.button,True,False,1)
        
        self.add(self.vbox)
        
    def limpiar(self,*args):
        self.entry.set_text("")
        
    def set_completation(self):
        sistemas = [
        "Ubuntu","Arch","Gentoo","Debian","Mint","openSUSE",
        ]
        liststore = Gtk.ListStore(str)
        for sistema in sistemas:
           liststore.append([sistema])

        completion = Gtk.EntryCompletion()
        completion.set_model(liststore)
        completion.set_text_column(0)
        return completion
        
    def uso(self,widget):
        if self.entry.get_text() != "":
         print "Uso %s" %(self.entry.get_text())
        


ventana = Ejemplo()
ventana.connect("delete-event", Gtk.main_quit)
ventana.show_all()
Gtk.main()

Eso es todo :D

Referencia : developer.gnome.org/

3 comentarios:

  1. gracias por el tutorial!! desde ya esperando el proximo.

    ResponderBorrar
  2. que tal!! podrias ayudarme con algo quiero ponerle color a un EventBox como tendria que hacerle ya prove modificando el metodo de pygtk pero no funciona,si pudieras decirme gracias.

    ResponderBorrar
    Respuestas
    1. Claro,lo que recomiendo es que uses css,si has usado este en paginas web no sera muy difícil,puedes ver un ejemplo que hice rápido aquí:

      Enlace
      Ese código lo rige el color de label,si tu código es mas avanzado y solo se pinta el fondo lo puedes modificar usando cajas,vbox y hbox para que cada zona tenga su estilo.

      Saludos

      Borrar

Los comentarios serán revisados antes de ser publicados.