lunes, 6 de diciembre de 2010

Manejo de etiquetas con botones en pygtk

El experimento de hoy fue mostrar y ocultar etiquetas por medio de botones, en un principio quise crear y eliminar las etiquetas, pero al eliminarla se eliminaba también su espacio, así que me dí a la tarea de simplemente cambiar el texto de las etiquetas. El botón "+" muestra el texto correspondiente, el botón "-" muestra caracteres en blanco, como si se "eliminara" la etiqueta.



Simple! Y divertido! Introduje el uso de lambda, me pareció apropiado después de algunos ejemplos ya mostrados anteriormente.

Código fuente aquí y a continuación:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

# Se importan las librerías requeridas
import pygtk

# Se revisa que la versión de pygtk sea la correcta
pygtk.require('2.0')

# Se importa la librería gtk
import gtk

# Se crea la clase "Base" para utilizarla en la aplicación
class Base:
# Se define la función "crea_ventana" para trabajar sobre esta función
def crea_ventana(self):
# Se crea la ventana principal del nivel superior
winpri = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Se establece el título de la ventana
winpri.set_title("Manejo de etiquetas")
# Se establece el tamaño de la ventana
winpri.set_size_request(250, 250)
# Se posiciona la ventana en la pantalla
winpri.move(500, 300)
# Se establece la propiedad de "no cambiar tamaño"
winpri.set_resizable(False)
# Se conecta la señal "delete_event" a la función que llamará a gtk.main_quit
# usando "lambda" para generar en la misma línea la función
winpri.connect("delete_event", lambda x,y: gtk.main_quit())
# ------------------- Comienza la creación de controles ------------------------
lb1 = gtk.Label("Linea 01")
lb2 = gtk.Label("Linea 02")
lb3 = gtk.Label("Linea 03")
lb4 = gtk.Label("Linea 04")
lb5 = gtk.Label("Linea 05")
lb6 = gtk.Label("Linea 06")
lb7 = gtk.Label("Linea 07")
lb8 = gtk.Label("Linea 08")
lb9 = gtk.Label("Linea 09")
lb10 = gtk.Label("Linea 10")
bt1 = gtk.Button("+")
bt2 = gtk.Button("+")
bt3 = gtk.Button("+")
bt4 = gtk.Button("+")
bt5 = gtk.Button("+")
bt6 = gtk.Button("+")
bt7 = gtk.Button("+")
bt8 = gtk.Button("+")
bt9 = gtk.Button("+")
bt10 = gtk.Button("+")
bt11 = gtk.Button("-")
bt12 = gtk.Button("-")
bt13 = gtk.Button("-")
bt14 = gtk.Button("-")
bt15 = gtk.Button("-")
bt16 = gtk.Button("-")
bt17 = gtk.Button("-")
bt18 = gtk.Button("-")
bt19 = gtk.Button("-")
bt20 = gtk.Button("-")
hb1 = gtk.HBox(True, 5)
hb2 = gtk.HBox(True, 5)
hb3 = gtk.HBox(True, 5)
hb4 = gtk.HBox(True, 5)
hb5 = gtk.HBox(True, 5)
hb6 = gtk.HBox(True, 5)
hb7 = gtk.HBox(True, 5)
hb8 = gtk.HBox(True, 5)
hb9 = gtk.HBox(True, 5)
hb10 = gtk.HBox(True, 5)
vb = gtk.VBox(True, 0)
# ------------------- Termina la creación de controles -------------------------
# ------------------- Se conectan las señales a los controles ------------------
bt1.connect("clicked", lambda s: lb1.set_text("Linea 01"))
bt2.connect("clicked", lambda s: lb2.set_text("Linea 02"))
bt3.connect("clicked", lambda s: lb3.set_text("Linea 03"))
bt4.connect("clicked", lambda s: lb4.set_text("Linea 04"))
bt5.connect("clicked", lambda s: lb5.set_text("Linea 05"))
bt6.connect("clicked", lambda s: lb6.set_text("Linea 06"))
bt7.connect("clicked", lambda s: lb7.set_text("Linea 07"))
bt8.connect("clicked", lambda s: lb8.set_text("Linea 08"))
bt9.connect("clicked", lambda s: lb9.set_text("Linea 09"))
bt10.connect("clicked", lambda s: lb10.set_text("Linea 10"))
bt11.connect("clicked", lambda s: lb1.set_text("        "))
bt12.connect("clicked", lambda s: lb2.set_text("        "))
bt13.connect("clicked", lambda s: lb3.set_text("        "))
bt14.connect("clicked", lambda s: lb4.set_text("        "))
bt15.connect("clicked", lambda s: lb5.set_text("        "))
bt16.connect("clicked", lambda s: lb6.set_text("        "))
bt17.connect("clicked", lambda s: lb7.set_text("        "))
bt18.connect("clicked", lambda s: lb8.set_text("        "))
bt19.connect("clicked", lambda s: lb9.set_text("        "))
bt20.connect("clicked", lambda s: lb10.set_text("        "))
# ------------------- Termina de conectar señales a los controles ------------
# Se añade a la ventana principal la caja vertical que contiene a los demás contenedores
winpri.add(vb)
# ------------------- Comienza el empaquetado de controles -------------------
hb1.pack_start(lb1, False, True, 0)
hb1.pack_start(bt1, False, True, 0)
hb1.pack_start(bt11, False, True, 0)
vb.pack_start(hb1, True, True, 0)
hb2.pack_start(lb2, True, True, 0)
hb2.pack_start(bt2, True, True, 0)
hb2.pack_start(bt12, True, True, 0)
vb.pack_start(hb2, True, True, 0)
hb3.pack_start(lb3, True, True, 0)
hb3.pack_start(bt3, True, True, 0)
hb3.pack_start(bt13, True, True, 0)
vb.pack_start(hb3, True, True, 0)
hb4.pack_start(lb4, True, True, 0)
hb4.pack_start(bt4, True, True, 0)
hb4.pack_start(bt14, True, True, 0)
vb.pack_start(hb4, True, True, 0)
hb5.pack_start(lb5, True, True, 0)
hb5.pack_start(bt5, True, True, 0)
hb5.pack_start(bt15, True, True, 0)
vb.pack_start(hb5, True, True, 0)
hb6.pack_start(lb6, True, True, 0)
hb6.pack_start(bt6, True, True, 0)
hb6.pack_start(bt16, True, True, 0)
vb.pack_start(hb6, True, True, 0)
hb7.pack_start(lb7, True, True, 0)
hb7.pack_start(bt7, True, True, 0)
hb7.pack_start(bt17, True, True, 0)
vb.pack_start(hb7, True, True, 0)
hb8.pack_start(lb8, True, True, 0)
hb8.pack_start(bt8, True, True, 0)
hb8.pack_start(bt18, True, True, 0)
vb.pack_start(hb8, True, True, 0)
hb9.pack_start(lb9, True, True, 0)
hb9.pack_start(bt9, True, True, 0)
hb9.pack_start(bt19, True, True, 0)
vb.pack_start(hb9, True, True, 0)
hb10.pack_start(lb10, True, True, 0)
hb10.pack_start(bt10, True, True, 0)
hb10.pack_start(bt20, True, True, 0)
vb.pack_start(hb10, True, True, 0)
# -------------------Termina el empaquetado de controles ---------------------
# Se muestran TODOS los controles
winpri.show_all()
# Se define la función inicial para llamar a la función principal
def __init__(self):
self.crea_ventana()
# Se define la función que llamará al ciclo principal de gtk
def main(self):
gtk.main()
if __name__ == "__main__":
base = Base()
base.main()

sábado, 4 de diciembre de 2010

Posicionando cajas en pygtk

Hoy pude divertirme un poco con pygtk, se me ocurrió la idea de hacer una pequeña aplicación que mezclara la posición de cajas, algo que no había hecho, y he aquí el resultado bien documentado, espero.



El código fuente aquí.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Importa las librerías a usar
import pygtk
# Revisa la versión requerida para usar
pygtk.require('2.0')
# Importa otra librería que se usará
import gtk

# Se crea la clase "Base" que se usará
class Base:
# Se define la función con la cual se sale de la aplicación
def salir(self, widget, data=None):
# gtk.main_quit sale sel ciclo gtk.main y termina la aplicación
gtk.main_quit()

# Se define la función para iniciar con la aplicación
def login(self):
# Se crea la ventana principal
wprincipal = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Se asigna título a la ventana principal
wprincipal.set_title("Cajas")
# Se establece el tamaño de la ventana
wprincipal.set_size_request(150, 85)
# Se posiciona la ventana en la pantalla
wprincipal.move(500,300)
# Se conecta la señal "delete_event" con la función "salir"
wprincipal.connect("delete_event", self.salir)
#------------------------ Comienza la creación de controles-----------------------------
# Se crea la caja vertical número 1, el parámetro "False" permite que
# los controles que contenga NO tengan todoso el mismo tamaño
vb1 = gtk.VBox(False, 3)
# Se añade la caja vertical a la ventana principal
wprincipal.add(vb1)
# Se crea la caja vertical número 2
vb2 = gtk.VBox(True, 3)
# Se crea la caja horizontal número 1
hb1 = gtk.HBox(True, 3)
# Se crea la caja horizontal número 2
hb2 = gtk.HBox(True, 3)
# Se creal el botón número 1
bt1 = gtk.Button("1")
# Se crea el botón número 2
bt2 = gtk.Button("2")
# Se crea el botón número 3
bt3 = gtk.Button("3")
# Se crea el botón número 4
bt4 = gtk.Button("4")
#------------------------ Termina la creación de controles------------------------------
#------------------------ Comienza el empaquetado de controles --------------------------------
# El botón número 1 se empaqueta en la caja horizontla número 1
hb1.pack_start(bt1, True, True, 0)
# El botón número 2 se empaqueta en la caja vertical número 2
vb2.pack_start(bt2, True, True, 0)
# El botón número 3 se empaqueta en la caja vertical número 2
vb2.pack_start(bt3, True, True, 0)
# La caja vertical número 2 se empaqueta en la caja horizontal número 1
hb1.pack_start(vb2, True, True, 0)
# La caja horizontal número 1 se empaqueta en la caja vertical número 1
vb1.pack_start(hb1, True, True, 3)
# El botón número 4 se empaqueta en la caja horizontal número 2
hb2.pack_start(bt4, True, True, 0)
#La caja horizontal número 2 se empaqueta en la caja vertical número 1
vb1.pack_start(hb2, True, True, 0)
#------------------------ Termina el empaquetado de controles ---------------------------------
# Se muestran TODOS los controles
wprincipal.show_all()
# Se define la función "__init__" que es el inicio de la aplicación desde el ciclo gtk.main
def __init__(self):
# Se llama a la función "login", nuestro verdadero inicio de la aplicación
self.login()
# Se define la función "main", que será el inicio de la aplicación desde python
def main(self):
# Se llama al ciclo principal de gtk.main
gtk.main()

if __name__ == "__main__":
base = Base()
base.main()

jueves, 2 de diciembre de 2010

Como programar una ventana de acceso en pygtk

Pues bien, mi nuevo experimento fue crear una ventana de acceso a usuarios, es decir, que pregunte el nombre de usuario y su contraseña; igualmente nada tan elaborado, pero significó un gran avance para mí en la comprensión de pygtk. En esta ocasión quise documentar un poco más para que fuera más entendible el código, que de igual forma, pueden descargar de aquí o verlo a continuación:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Importa las librerías a usar
import pygtk
# Revisa la versión requerida para usar
pygtk.require('2.0')
# Importa otra librería que se usará
import gtk

# Se crea la clase "Base" que se usará
class Base:
# Se define la función con la cual se sale de la aplicación
def salir(self, widget, data=None):
# gtk.main_quit sale sel ciclo gtk.main y termina la aplicación
gtk.main_quit()

# Se define la función para iniciar con la aplicación
def login(self):
# ven_ent se inicializa como una ventana de gtk del nivel superior
ven_ent = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Se conecta el evento "delete_event" a la función "salir"
ven_ent.connect("delete_event", self.salir)
# Se dimensiona la ventana en pixeles (ancho, alto)
ven_ent.set_size_request(225,95)
# Se establece el título de la ventana
ven_ent.set_title("Acceso de Usuarios")
# Se establece la ventana como "modal" para prevenir multiples interacciones desde la misma ventana
ven_ent.set_modal(True)
# Se establece la ventana para no cambiar de tamaño
ven_ent.set_resizable(False)
# Se ubica la ventana en las coordenadas de la pantalla (X,Y)
ven_ent.move(500,300)
# Se crea una caja vertical, el primer parámetro de gtk.VBox es si es homogeneo, es decir,
# del mismo tamaño los widgets contenidos, el segundo parámetro es el espacio vertical 
# entre sus widgets
box1 = gtk.VBox(False, 3)
# Se agrega la caja a la ventana
ven_ent.add(box1)
# Se crea un caja horizontal, semejante al anterior
ct1 = gtk.HBox(True, 0)
# Se crea la etiqueta
lb_name = gtk.Label("Nombre")
# Se muestra la etiqueta
lb_name.show()
# Se empaca la etiqueta a la caja horizontal con "pack_start";
# el primer argumento es el objeto a empacar, en este caso la
# etiqueta, el segundo argumento es expand, si es True los controles
# ocupan todo el espacio disponible, si es False sólo lo que requiere;
# el tercer argumento es fill, si es True el espacio extra se usa en
# los mismos controles, si es False queda como espacio extra; el 
# cuarto argumento es el espacio entre controles a la hora de empaquetarlos
ct1.pack_start(lb_name, True, True, 3)
# Se crea una caja de entrada donde recibiremos datos del usuario
eb_name = gtk.Entry()
# Se muestra la caja de entrada
eb_name.show()
# Se empaqueta la caja de entrada, semejante a la anterior
ct1.pack_start(eb_name, True, True, 3)
# Se empaqueta la caja horizontal en la caja vertical, semejante a las anteriores;
# con esto se terminan los controles horizontales, los siguientes controles
# que se añadan tendrán un "salto de linea" por así decirlo, es decir, pasan
# al siguiente espacio vertical
box1.pack_start(ct1, True, True, 3)
# Se crea otra caja horizontal, semejante a las anteriores
ct2 = gtk.HBox(True, 0)
# Se crea la etiqueta
lb_passw = gtk.Label("Clave")
# Se muestra la etiqueta
lb_passw.show()
# Se empaqueta la etiqueta semejante a las anteriores
ct2.pack_start(lb_passw, True, True, 3)
# Se crea la caja de entrada, semejante a la anterior
eb_passw = gtk.Entry()
# Se establece la visibilidad de los datos de la caja de entrada;
# si es True, los caracteres son mostrados normalmente, si es False
# muestra asteriscos o círculos o no muestra nada, segun se especifique
# con set_invisible_char(ch)
eb_passw.set_visibility(False)
# Se muestra la caja de entrada
eb_passw.show()
# Se empaqueta la caja de entrada, semejante a la anterior
ct2.pack_start(eb_passw, True, True, 3)
# Se empaqueta la caja horizontal en la caja vertical, semejante a las anteriores;
# con esto se genera que los siguientes controles pasen al siguiente espacio vertical
box1.pack_start(ct2, True, True, 3)
# Se crea otra caja horizontal más, semejante a las anteriores
ct3 = gtk.HBox(True, 0)
# Se crea un botón con la etiqueta integrada "Aceptar"
bt_aceptar = gtk.Button("Aceptar")
# Se conecta la señal "clicked" a la función "salir"
bt_aceptar.connect("clicked", self.salir)
# Se muestra el botón
bt_aceptar.show()
# Se empaqueta el botón en la caja horizontal, semejante a las anteriores
ct3.pack_start(bt_aceptar, True, True, 3)
# Se crea otro botón con la etiqueta integrada "Cancelar"
bt_cancelar = gtk.Button("Cancelar")
# Se conecta la señal "clicked" a la función "salir"
bt_cancelar.connect("clicked", self.salir)
# Se muestra el botón
bt_cancelar.show()
# Se empaqueta el botón en la caja horizontal, semejante al anterior
ct3.pack_start(bt_cancelar, True, True, 3)
# Se empaqueta la caja horizontal en la caja vertical, semejante a las anteriores;
# con esto se genera que los siguientes controles pasen al siguiente espacio vertical
box1.pack_start(ct3, True, True, 5)
# Se muestra la caja horizontal 1
ct1.show()
# Se muestra la caja horizontal 2
ct2.show()
# Se muestra la caja horizontal 3
ct3.show()
# Se muestra la caja vertical
box1.show()
# Se muestra la ventana
ven_ent.show()
# Se define la función "__init__" que es el inicio de la aplicación desde el ciclo gtk.main
def __init__(self):
# Se llama a la función "login", nuestro verdadero inicio de la aplicación
self.login()
# Se define la función "main", que será el inicio de la aplicación desde python
def main(self):
# Se llama al ciclo principal de gtk.main
gtk.main()

if __name__ == "__main__":
base = Base()
base.main()