Desarrollo de Aplicaciones con PyGTK - Alejandro Valdés

Expositor: Alejandro Valdés Jimenez (avaldes)

Moderador: Sergio Infante Montero (neosergio)

Sabado 13 de Noviembre del 2010, 19 Horas UTC

irc.gnome.org #gnome-hispano


Damos inicio a la charla IRC de GNOME Hispano

la charla tiene una duracion de una hora aproximadamente y de ahi depende de nuestro querido expositor

en esta oportunidad retomamos las charlas

la metodologia es la siguiente para mantener el orden:

el expositor empezara presentado el tema

y solo si el lo permite se le interrumpira con una pregunta

o tambien

pueden enviarme sus preguntas como mensaje privado 

y yo las hare en orden de llegada y de acuerdo al contexto 

para no interrumpir el transcurso normal de la misma charla

Este mes nos acompaña un gran amigo y hacker 

es avaldes 

Alejandro Valdes

mas detalles sobre el y su experiencia en http://people.gnome.org/~avaldes/

y el tema de la charla sera: Desarollo de Aplicaciones con PyGTK

sin mas preambulo los dejo con avaldes 

Gracias neosergio !

URL de la charla, recursos previos y posteriores y otros detalles en http://es.gnome.org/Eventos/CharlasIRC/CharlaNoviembre2010

Hola a todos....

antes de comenzar, agraceder a sergio esta segunda invitación... :D salió un vale otro

:D

como bien dice sergio

los recursos de esta charla las pueden encontrar en la dirección que el indica

de gran ayuda sería que fueran viendo la presentacion

que está en tales recursos

para asi ir en un cierto orden

bien... comencemos entonces..

algo importante, que no contempla esta charla...

guerra santa entre lenguajes de programación...

:D

por qué python y no C..... blabla....

:D

tampoco es un tutotial de python... :D

el objetivo es mostrarles la diferentees herramientas que existen para que puedan comenzar

a desarrollar sus aplicaciones

Nota: Las diapositivas seran muy utiles para esta charla, asi como demas archivos pueden encontrarlos en http://es.gnome.org/Eventos/CharlasIRC/CharlaNoviembre2010?action=AttachFile&do=get&target=gnome-hispano2010.tar.bz2

y en particular para GNOME.

:D

bien,

primero que todo

veamos algunos conceptos

que es una GUI

o Graphical User Interface

básicamente, los usuarios podemos interactuar con las computadoras de dos formas

a punta de comandos en alguna terminal

(algunos serán mas fanáticos de esa opción)

:D

o podemos interatuar a traves de elementos como ventanitas, botones, etc

mediante el uso de un ratón y el mismo teclado.

pues bien, esta segunda fiorma de interacción es a través de este tipo de interfaces gráficas.

donde las acciones que emprenda el programa en uso

dependerá de la manipulación de tales elementos (ventanas, botones, etc.)

para ser mas precisos con los conceptos

a estos elementos les llamaremos widgets

nombre genérico para los botones, ventanas, barras de menú, de herramientas, etc.

estos widgets

se ven afectados por ciertos eventos que producen ciertas señales

por ejemplo un boton, tiene algunas señales "clicked"

que es cuando se ha presionado tal boton.

para poder, como programador, dar funcionalidad a estos widgets

debemos capturar la ocurrencia de tales señales

es decir, cuando se presiones tal boton.

una vez que capturamos tal señal... debemos saber que hacer...

aparece el concepto de callbacks

que son básicamente las funciones que se llamarán cuando se detecte alguna señal.

hasta el momento, he mencionado algunos elementos que componen las GUI.

sin embargo, hay un elemento importante a mencionar rescto al paradigma de programación

que se utiliza

en particular, utilizaremos la programación por eventos

(http://es.wikipedia.org/wiki/Programaci%C3%B3n_dirigida_por_eventos)

que básicamente nos indica

que la ejecución o flujo de un programa

depende de los eventos que ocurran. (presionar un botón, cerrar una ventana, etc)

Nota: Preguntas por mensaje directo

por qué hago referencia a este paradigma

pues, GTK funciona de esta manera.

GTK utiliza un loop principal (gtk.main)

que queda a la espera de algún evento

y de pasar el control a la función o callbacks correspondiente.

en la presentación que esá en los recursos pueden ver una imagen que describe tal operación.

Luego de esta pequeña introducción a algunos conceptos

paso a mencionarles algunas de las herramientas necesarias 

primero, el lenguaje... en este caso utilizaremos python, 

sin embargo GTK lo puden utilizarn con C, perl, etc...

bueno, python... es un lenguale interpretado y orientado a objetos

especial para quienes son impacientes :D

GTK... es el toolkit multiplataforma neceario apra crear las

intergaces gráficas de usuario...

está escrito en C y tienen bindings para C++, java,perl, python... entre otros.

el binding que utilziaremos es pygtk

el cual forma parte del proyecto de GNOME..

ya tenemos el lenguaje y la bilbioteca necesaria para crear nuestros programas

pero sumemos otro elemento

un asistente para diseño de GUIs

ese es GLADE

un programa que nos permite crear el layout de nustro programa

jugar con las posiciones de los widgets, cambiarlso de posición, de tamaño, etc.

ideal para quienes deben mostrar prototipos de programas...

glade guarda toda la información del layout del programa

archivos de formato XML

los cuales pueden luego ser cargados por los programass en tiempo de ejecución.

como nuestros programas pueden hacer esto

pues bien, con el uso de libglade.

voy a mencionar libglade, pese a que hoy en dia se utilzia gtkbuilder

pero necesito hacer la comparación

:D

Pregunta: ¿Cual seria la diferencia notable entre libglade y gtkbuilder?

ya que se requeire de colaboradores para portatr aplciaciones que utilizan libglade a gtkbuilder (paso el aviso... :D)

ok, respodne de inmediato...

libglade no forma parte de GTK

lleva un desarrollo independiente

lo que puede demorar en el soprote de nuevos widgets

por otro lado, gtkbuilder si es parte de GTK

Pregunta de S[e]C : si decido usar libglade en lugar de gtkbuilder, ¿que ventaja tengo? 

por lo que los desarrolladores de GTK mantienen al dia el soporte.

ok.

basicamente operación es similar...

de hecho, hoy en dia cuando creas un proyecto con glade puedes seleccionar si es para ser utilziado con libglade o gtkbuilder.

yo creo que la ventaja mas inportante tiene que ver con que gtkbuilder es parte de GTK.

por ende, cualquier nuevo widget por ejemplo, podría ser utilizado inmediatamente con gtkbuilder.

bueno...

un detalle que se me escapa... 

con libglade/gtkbuilder

logras separar la parte lógica de tu programa

que significac esto....

que eventualmente, no necesitarás hacer cambio en el código de tu programa si requieres

modificar la "cara" del programa

bastará con que se modifique el archivo XML (a traves de glade)

eso si... respetando los nombres de los widgets...

si agregas o eliminas, necesariamente tendrás que modificar tu programa..

bien...

hasta el momente tenemos el lenguaje, la libreria gráfica y el asistente de diseño...

antes que se me olvide

para convertir archivos de glade a gtkbuider

existe la herramienta: gtk-builder-convert archivo-glade archivo-gtkbuilder

para quienes se interesen... :D

para los programadores siempre es de gran utilidad

la información de las APIs que se utilizan

para tal labor tenemos devhelp

que es un programa que nos permite de forma rápida

ver las definiciones de funciones, señales, etc....

en debian, el paquete que tiene la información de gtk para python es: python-gtk2-doc

si vuestra intención

es desarrollar aplciaciones para GNOME...

pues hay otro elemento a considerar, el HIG (Human Interface Guidelines)

que básicamente son recomendaciones que como deberiamos

estructurar los programas

de manera que la aplicación sea atractiva, accesible a todos y mas uniforme respecto al ambiente de escritorio...

por último... antes de pasar a los ejemplos

es importante elegir un buen editor de textos

para escribir nustros programas...

opciones hay muchas.. y queda al gusto del consumidor... :D

bien... hay consultas hasta aqui?

para comenzar con los ejemplos?

están despiertos?

:D

dale 

quiero hacer una acotación :P 

yo he usado glade y me he fijado que si trabajo con gtkbuilder, por ej al agregar un combobox en las propiedad "elementos" tengo un símbolo " ! " que dice, "esta propiedad solo está soportada en el formato libglade", podía ser esta una ventaja de libglade v/s gtkbuilder, para hacer un paralelismo digo

no creo que sea una ventaja..

S[e]C: pasa al reves tambien

si solo está disponible para libglade es por que en GTK talvés ya no lo soportarán

ahora, no recuerdo si lo mencioné, pero

todas las aplicaciones de GNOME que utilizan libglade

deben ser portadas a gtkbuilder...

ok =) 

y en tal caso ya no importará si es mas ventajoso libglade.. :D

Nota: se requiere hackers para esta tarea

te suguiero que desarrolles pensando el eso...

:D

bien

vamos a los ejemplos

primero

un ejemplo sin uso de señales...

ok

pirmeor debemos impotar la libreria de gtk

en este caso con

import gtk

de esa manera tenemos acceso a utilizarla

en los recursos menciono los paquetes que se deben instalar...

(espero que estén viendo los ejemplos en sus PCs....)

una pregunta, si trabajas con gtkbuilder desde python, ya no es necesario importar pygtk?

gtkbuilder está dentro de GTK

Nota: Video de ejemplo sin uso de señales http://deb.utalca.cl/ogv/free1.ogv

por lo tanto si lo requieres

lo que no debes importar es el soporte de libglade

ok

import gtk.glade

eso ya no mas...

:D

porque desarrollé una aplicación en windows y no fue necesario importar pygtk

veamos el primer ejemplo

 

import gtk

# create window

window = gtk.Window()

window.set_default_size(350,100)

window.set_title('Basic without signals')

window.set_position(gtk.WIN_POS_CENTER)

# create button

button = gtk.Button()

button.set_label('Click to exit')

# add button to window (container)

window.add(button)

# show all widgets

window.show_all()

# mail loop

gtk.main()

vemos la importación de gtk

luego la creación del widget window

al cual luego podemos cambiarles ciertas propiedaes...

aqui cobra importancia devhelp

ahi vemos todo lo relacionado al widget... sus propiedades, sus métodos, etc..

ademas de la ventana

se crea mas abajo un boton

al cual se la ha puesto cierto texto

una características de ciertos widgets

es que funcionan como contenedores 

es decir

se puede contener dentro de ellos a otros widgets

en este caso

metemos en la ventana

el boton creado.

la última linea

el gtk.main()

la la llamada para que el programa quede en un loop

a la espera de los eventos que el usuario realize.

para ejecutar el ejemplo

en una terminal

ejecutan

python nombreprograma.py

al ejecutarlo

verán (eso espero.. :D) una ventana con un tremedo boton dentro de ella

si presiionan el boton

pues no pasara nada

al presionar el boton

se gatilla la señal "clicked" del boton

que nuestro programa no captura..

al igual que al hacer click en cerrar la ventana

el programa se cerrará

pero la terminal segurá "tomada"

claro, tampoco capturamos la señal, por lo tanto no cerramos

de forma correcta el programa.

veamos el sigueinte eejmplo

el reciente ejemplo tiene por nombre: basic1_without_signals.py

el de ahora es: basic2_with_signals.py

Nota: Ejemplo con señales http://deb.utalca.cl/ogv/free2.ogv

para no llenar de código la pantall

pondré lo importante en este caso ...

como capturamos la señal y como hacemos referencia a la función callback

window.connect ("delete_event",on_delete_event)

en este caso

el widget windows, se conecta a la señal "delete_event"

que es cuando cerramos la ventana

cuando suceda tal evento, se invocara a la función: on_delete_event

como aparece en:

 

window.connect ("delete_event",on_delete_event)

ahora bien,

que tiene tal funcion?...

 

def on_delete_event (widget, event, user_data=None):

    print "Bye bye!"

    gtk.main_quit()

 

en este caso tiene 3 parámetros..

la refernecia al mismo widget, mas la información del evento y otros parámetros opcionales

vuelvo a insistir

con devhelp

pueden ver mas información respecto de estas funciones.

bien..

la función

muestra por la terminal un mensaje

y lo mas importante

terminal el loop

iniciado por gtk.main()

de esa manera

el programa termina adecuadamente.

ahora si sejecutamos el programa

vemos que al presionar el boton2

aparece un mensaje en la termianl

realizado por la función callback asociada a ese boton

y si presionamos cerrar la ventana

ahora se cierra corectamente y devuelve el control de la terminal.

 

tienen dudas hasta aqui?

todo claro :D

o

ok

:D

el siguiente ejemplo que veremos

y último (los demas se los dejo de tarea...) :D

es el uso de gtkbuilder

:D

el ejemplo es el :basic3_gtkbuilder.py

este ejemplo hace referencia o llama en tiempo de ejecución al

archivo app.xml

que es el archivo generado con GLADE

y con soporte para gtkbuilder

tal archivo

lo pueden abrir con GLADE

y ver como está comformado..

la parte interesante de este ejemplo

es que los widgets

ya nos crearemos en el programa

window = gtk.Window()

se acuerda.n...

ahora los cargaremos del archivo xml

las lineas importantes...

glade = gtk.Builder()

Nota: Estos ejemplos se encuentran en la carpeta basic/ de los ejemplos

glade.add_from_file("app.xml")

glade = gtk.Builder()

glade.add_from_file("app.xml")

con esas dos lineas

creamos un instancia de gtkbuilder

y luego indicamos cual es el archivo xml a cargar

window = glade.get_object('window')

button1 = glade.get_object('button1')

button2 = glade.get_object('button2')

luego

obtenemos los widgets haciendo referencia a sus nombres

definidos en glade

luego..

podemos utilizar los widgets tal cual los

ejemplos anteriores....

 

la idea es que modifiquen las posiciones de 

los widgets con glade

y vuelvan a ejecutar el programa

de esa forma verán que no es necesario modificar código..

claro que si han cambiado el nombre de algun widget, o lo han eliminado... tendrán

que modificar el código

al igual que si agregan uno.

si solo modifican las posiciones de los widgets, nada deben hacer en el código

:D

consultas...

Ninguna por aca, se entiende todo

si el parámetro user_data=None

que dato se pasa, cuándo se usa?

artuslla, en la conexión al calback

le puedes pasar todos los parámetros que quieras..

me podrías dar un ejemplo por favor, no logro entenderlo bien

claro

en el mismo ejemplo de mas arriba

ok

def on_delete_event (widget, event, user_data=None):

ese nombre user_data es mas bien generico

pero puedes para por ejemplo otros widgets

lo que indica en este caso user_data=None

es que si no se pasa tal parametro, entonces el valor por defecto es None

:D

bien amigos

al igual que la ves anterior

el tiempo se hizo poco

y no alcanzamos a ver todos los ejemplo

sin embargo

ya saben donde desacargarlos

y jugar con ellos

eso sería. :D

alejandro dijiste que hacian falta colaboradores, donde esta la informacion ?

lnx, http://live.gnome.org/GnomeGoals/RemoveLibGladeUseGtkBuilder

ok, gracias

El log de la charla estara disponible en unos momentos en: http://es.gnome.org/Eventos/CharlasIRC/CharlaNoviembre2010

thanks avaldes =)

muchas gracias!

Muchas gracias avaldes 

por tu tiempo y espero que nos brindes otra charla en los meses posteriores

cuando quieran....

:D

El proximo mes tambien tendremos charla, asi que atentos a los mensajes

gracias a todos los participantes de la charla

Un saludo y gracias a todos por su tiempo

ok. Estuvo bien. Gracias.

En pocos minutos el log de charla

Eventos/CharlasIRC/CharlaNoviembre2010/Log_CharlaIRCNoviembre2010 (última edición 2010-11-13 20:45:30 efectuada por SergioInfante)