XalalinuX Grupo de Usuarios de Linux de Xalapa

1Mar/091

Tutorial Básico (muy básico) de PyGTK

Últimamente he estado programando un poco con Python y pyGTK y me gustó la facilidad que tiene este lenguaje para crear intefaces de usuario. A continuación explicaré un pequeño tutorial sobre el desarrollo de un programa sencillo. Existe un muy buen tutorial en esta página http://www.pygtk.org/pygtk2tutorial-es/index.html . Muchas cosas que muestro aquí salieron de ese tutorial. La idea es generar una ventana que muestre una imagen, una etiqueta, un caja de texto y un botón. Al presionar el boton cambiará el contenido de la etiqueta, donde tendremos el siguiente resultado.

y el código para generar este programa es el siguiente:

try:
    import gtk
except:
    print 'Se necesita pyGTK para correr este programa'

class VentanaXalalinux(gtk.Window):
    ''' Ventana principal, es una clase que contiene
    otras clases '''

    def delete_event(self, widget, event):
        print 'Se genero el evento delete'
        return False
        # Si devuelve True no se cierra el programa

    def destroy(self, widget):
        gtk.main_quit()

    def __init__(self):
        # Constructor de la clase
        gtk.Window.__init__(self)
        self.connect('delete_event', self.delete_event)
        self.connect('destroy', self.destroy)
        self.set_border_width(0)
        self.set_title('-:: XalalinuX ::-')
        self.set_role('main')
        self.set_position(gtk.WIN_POS_CENTER)
        # Se agrega el contenedor principal
        self.contenedor = gtk.VBox()
        # Cargamos una imagen
        self.imagen = gtk.Image()
        self.imagen.set_from_file('logo-xalalinux.png')
        self.contenedor.pack_start(self.imagen, True, True)
        # Creamos una etiqueta y le damos formato
        self.LMensaje = gtk.Label()
        self.LMensaje.set_markup('Etiqueta modificada ')
        self.contenedor.pack_start(self.LMensaje, True, True)
        # Creamos un contenedor horizontal para poner
        # una caja de texto y un boton
        self.hbox = gtk.HBox()
        self.Entrada = gtk.Entry()
        self.Boton = gtk.Button(stock=gtk.STOCK_APPLY)
        self.Boton.connect('clicked', self.modificar_etiqueta)

        self.hbox.pack_start(self.Entrada, True, True)
        self.hbox.pack_start(self.Boton, False, False)
        self.contenedor.pack_start(self.hbox, False, False)

        self.add(self.contenedor)
        self.show_all()

    def modificar_etiqueta(self, widget):
        texto = self.Entrada.get_text()
        self.LMensaje.set_markup(''+ texto + '')

    def main(self):
        gtk.main()

if __name__ == '__main__':
    ventana = VentanaXalalinux()
    ventana.main()

Este programa se puede descargar de aqui y el logo de aqui. Para correr el programa deben darle desde la terminal

python xalalinux.py

Aqui viene la explicación de cada parte. Al inicio del programa importamos el modulo gtk que es el que nos permite generar todos los objetos para la interfaz gráfica. En Python TODOS los elementos son objetos y siempre se debe pensar en ellos como objetos. Aqui sólo creamos una clase llamada VentanaXalalinux que se hereda de la clase gtk.Window, es decir VentanaXalalinux es una clase gtk.Window (más lo que nosotros le agreguemos), osea una ventana.

class VentanaXalalinux(gtk.Window):

Cuando creamos un objeto de la clase VentanaXalalinux primero se llama al constructor que se encarga de inicializar al objeto. En este caso en el constructor dibujamos toda la ventana. Primero llamamos al constructor de la clase gtk.Window. Esto es para tener acceso a todos los atributos de la clase.

gtk.Window.__init__(self)

Luego definimos algunas propiedades en particular. Primero se conectan eventos generados con las funciones definidas en la clase.El evento delete_event se genera el cerrar la ventana. Cuando se cierra la ventana se ingresa a la funcion self.delete_event que devuelve un valor False, si esta función devuelve un valor True el programa no terminará, esto sirve para poner dialogos de "Seguro que desea salir" dentro de esa funcion. Si devuelve False se genera el evento destroy y se termina la aplicacion.

self.connect('delete_event', self.delete_event)
self.connect('destroy', self.destroy)

Posteriormente cambiamos algunos atributos de la ventana como el titulo, si se trata de la ventana principal el borde y la posición en la pantalla.

self.set_border_width(0)
self.set_title('-:: XalalinuX ::-')
self.set_role('main')
self.set_position(gtk.WIN_POS_CENTER)

Ya con la ventana definida ahora se agregan los controles que tendrá la ventana. Cuando vamos a utilizar varios controles, en GTK es necesario empaquetarlos para distribuirlos en la ventana. Primero agregamos una caja vertical que será el contenedor principal del programa.

self.contenedor = gtk.VBox()

y comenzamos a agregar controles dentro de ese contenedor. En este ejemplo quise cargar una imagen. Se debe tener una imagen con ese nombre en el mismo directorio donde se ejecuta el programa.

self.imagen = gtk.Image()
self.imagen.set_from_file('logo-xalalinux.png')
self.contenedor.pack_start(self.imagen, True, True)

La última línea agrega la imagen al contenedor. Ahora creamos una etiqueta con el texto formateado y la agregamos al contenedor.

self.LMensaje = gtk.Label()
self.LMensaje.set_markup('Etiqueta modificada ')
self.contenedor.pack_start(self.LMensaje, True, True)

Para poner la caja de texto junto con el boton necesitamos otro contenedor pero ahora horizontal. Y ahora agregar la caja de texto y el boton a ese contenedor horizontal. Tambien asociamos el evento clicked a la funcion self.modificar etiqueta para que siempre que se de click al boton se ejecute esta funcion

self.hbox = gtk.HBox()
self.Entrada = gtk.Entry()
self.Boton = gtk.Button(stock=gtk.STOCK_APPLY)
self.Boton.connect('clicked', self.modificar_etiqueta)

self.hbox.pack_start(self.Entrada, True, True)
self.hbox.pack_start(self.Boton, False, False)
self.contenedor.pack_start(self.hbox, False, False)

Por ultimo agregamos el contenedor a la ventana y mostramos todos los widgets.

self.add(self.contenedor)
self.show_all()

La funcion modificar_etiqueta sólo toma el valor de la caja de texto y la concatena con el codigo de formato para la etiqueta. Por ultimo aqui es donde creamos y ejecutamos nuestro objeto. La funcion main() se encarga de comenzar con el programa.

if __name__ == '__main__':
    ventana = VentanaXalalinux()
    ventana.main()