= 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 '' ---- ''neosergio'' {{{ 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 }}} '''avaldes''' {{{ Gracias neosergio ! }}} ''neosergio'' {{{ URL de la charla, recursos previos y posteriores y otros detalles en http://es.gnome.org/Eventos/CharlasIRC/CharlaNoviembre2010 }}} '''avaldes''' {{{ 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 }}} ''neosergio'' {{{ 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 }}} '''avaldes''' {{{ 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) }}} ''neosergio'' {{{ Nota: Preguntas por mensaje directo }}} '''avaldes''' {{{ 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 }}} ''neosergio'' {{{ Pregunta: ¿Cual seria la diferencia notable entre libglade y gtkbuilder? }}} '''avaldes''' {{{ 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 }}} ''neosergio'' {{{ Pregunta de S[e]C : si decido usar libglade en lugar de gtkbuilder, ¿que ventaja tengo? }}} '''avaldes''' {{{ 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 }}} p0fk {{{ dale }}} S[e]C {{{ 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 }}} '''avaldes''' {{{ no creo que sea una ventaja.. }}} dub {{{ S[e]C: pasa al reves tambien }}} '''avaldes''' {{{ 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... }}} S[e]C {{{ ok =) }}} '''avaldes''' {{{ y en tal caso ya no importará si es mas ventajoso libglade.. :D }}} ''neosergio'' {{{ Nota: se requiere hackers para esta tarea }}} '''avaldes''' {{{ te suguiero que desarrolles pensando el eso... :D bien vamos a los ejemplos primero un ejemplo sin uso de señales... }}} artuslla {{{ ok }}} '''avaldes''' {{{ 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....) }}} artuslla {{{ una pregunta, si trabajas con gtkbuilder desde python, ya no es necesario importar pygtk? }}} '''avaldes''' {{{ gtkbuilder está dentro de GTK }}} ''neosergio'' {{{ Nota: Video de ejemplo sin uso de señales http://deb.utalca.cl/ogv/free1.ogv }}} '''avaldes''' {{{ por lo tanto si lo requieres lo que no debes importar es el soporte de libglade }}} artuslla {{{ ok }}} '''avaldes''' {{{ import gtk.glade eso ya no mas... :D }}} artuslla {{{ porque desarrollé una aplicación en windows y no fue necesario importar pygtk }}} '''avaldes''' {{{ 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 }}} ''neosergio'' {{{ Nota: Ejemplo con señales http://deb.utalca.cl/ogv/free2.ogv }}} '''avaldes''' {{{ 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? }}} S[e]C {{{ todo claro :D }}} '''avaldes''' {{{ 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() }}} ''neosergio'' {{{ Nota: Estos ejemplos se encuentran en la carpeta basic/ de los ejemplos }}} '''avaldes''' {{{ 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... }}} vkhemlan {{{ Ninguna por aca, se entiende todo }}} artuslla {{{ si el parámetro user_data=None que dato se pasa, cuándo se usa? }}} '''avaldes''' {{{ artuslla, en la conexión al calback le puedes pasar todos los parámetros que quieras.. }}} artuslla {{{ me podrías dar un ejemplo por favor, no logro entenderlo bien }}} '''avaldes''' {{{ claro en el mismo ejemplo de mas arriba }}} artuslla {{{ ok }}} '''avaldes''' {{{ 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 }}} lnx {{{ alejandro dijiste que hacian falta colaboradores, donde esta la informacion ? }}} '''avaldes''' {{{ lnx, http://live.gnome.org/GnomeGoals/RemoveLibGladeUseGtkBuilder }}} lnx {{{ ok, gracias }}} ''neosergio'' {{{ El log de la charla estara disponible en unos momentos en: http://es.gnome.org/Eventos/CharlasIRC/CharlaNoviembre2010 }}} S[e]C {{{ thanks avaldes =) }}} vkhemlan {{{ muchas gracias! }}} ''neosergio'' {{{ Muchas gracias avaldes por tu tiempo y espero que nos brindes otra charla en los meses posteriores }}} '''avaldes''' {{{ cuando quieran.... :D }}} ''neosergio'' {{{ 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 }}} Begersummum {{{ ok. Estuvo bien. Gracias. }}} ''neosergio'' {{{ En pocos minutos el log de charla }}}