PyGTK y Glade, GUIs instantáneas

gtkPython

Breve reseña de como hacer una interfaz gráfica usando PyGTK y glade-3.

Introducción

Diseñar un interfaz gráfica para tu aplicación es muy sencillo. Además, con glade no tendrás que pelearte mucho con la API que vas a usar, GTK+.

NOTA: Aunque no necesitarás saber ampliamente como funciona GTK, sí que deberías saber un poco sobre GTK. Hay mucha documentación disponible (de hecho, GTK tiene una magnífica documentación).

Ingredientes

Básicamente:

  1. Glade
  2. PyGTK

Y obviamente, Python y Emacs... bueno, realmente te serviría cualquier otro editor, pero ya que estamos, hacemos las cosas bien. Sticking out tongue

Para instalarlos, como de costumbre (en Debian):

# apt-get install python python-gtk2 emacs21 glade

Diseñando la interfaz

Para empezar, es una buena idea que crees un directorio donde guardar todos los archivos necesarios.

$ mkdir ejemplo
$ cd ejemplo

Lanza glade para crear la interfaz:

$ glade-3

Se abrirá el gestor de proyectos, la paleta y la ventana de propiedades. Como ejemplo, simplemente puedes hacer una ventana con un botón para cerrarla.

Para crear la ventana principal, pincha sobre el widget Toplevels->Window. Aparecerá una nueva ventana, que será con la que trabajarás. Puedes colocar un botón que ocupe todo el área, pero no podrías añadir más cosas. Lo que vas a hacer es insertar un widget especial, que no se muestra, que sirve para almacenar otros widgets, HBox. Está en Containers->Horizontal Box

Cuando lo coloques en la ventana, te saldrá un mensaje preguntándote el número de elementos que quieres meter: 2.

En el lado izquierdo, puedes poner una etiqueta, Control and Display->Label. Por lo menos, para este ejemplo es muy grande, así que en la ventana de propiedades, en la pestaña Empaquetado desmarca Expandir y LLenar. En General puedes ponerle el valor a la etiqueta: 'Acción'.

En el lado derecho coloca un botón, Control and Display->Button. Como también es muy grande, de nuevo en Empaquetado desmcarca Expandir y LLenar. En General cambia el valor que se muestra en el botón (donde pone Etiqueta): 'salir'.

Es un buen momento para guardar. Llámalo como quieras, "ejemplo.glade" es una buena opción. Lo que se guarda en "ejemplo.glade" es un esquema de todos los componentes que has usado en la interfaz, junto con sus atributos, señales, etc. en XML. Esto será lo que luego utilices a la hora de generar la interfaz con libglade.

Por último, vas a añadir un par de manejadores de señal para capturar un evento y una señal. Uno para el evento, "delete-event", de la ventana principal. Este evento se lanzará cuando se cierre la aplicación (bien pulsando Alt+F4, bien haciendo click en el botón de cierre, etc.). El otro para la señal "clicked" del botón que has añadido.

Para ello, selecciona la ventana principal (desde el 'widget tree') y en el gestor de Propiedades, en la pestaña Señales, busca la señal "delete-event" (que pertenece a GtkWidget), y añade un manipulador, "on_window1_delete_event". Repite los mismos pasos para el manipulador "on_button1_clicked" de la señal "clicked" del botón que has creado.

Guarda los cambios y cierra el Glade.

Escribiendo el código

Ahora, desde el mismo terminal, edita un fichero nuevo, que puedes llamar ejemplo.py. Ábrelo con nuestro editor favorito: Sticking out tongue

$ emacs ejemplo.py

Y escribe lo siguiente:

# -*- coding: utf-8 -*-
 
import pygtk
pygtk.require("2.0")
import gtk, gtk.glade
 
class App:
 
    def __init__(self):
        self.glade = gtk.glade.XML("ejemplo.glade")
        self.glade.signal_autoconnect(self)
        self.glade.get_widget("window1").show_all()
 
    def on_window1_delete_event(self, widget, event):
        gtk.main_quit()
 
    def on_button1_clicked(self, widget):
        gtk.main_quit()
 
if __name__ == "__main__":
    try:
        a = App()
        gtk.main()
    except KeyboardInterrupt:
        pass

En el __init__ puedes ver varias cosas. En primer lugar, cómo cargas la interfaz que has hecho antes:

gtk.glade.XML("ejemplo.glade")

Después, cómo le indicas donde debe buscar los callbacks (o manejadores de señal), para las señales que le has activado, en este caso, en la misma clase.

Por último, el método self.glade.get_widget("window1") devuelve una referencia al widget "window1". Se llama a show_all() para que muestre su contenido y listo.

Sobre las firmas de los callbacks, hay mucha información en la documentación de la API de GTK. Simplemente decir que en este caso, necesitas un argumento para el widget que emite la señal, y, si es un evento, otro argumento para especificar el evento.

De nuevo, guarda los cambios y cierra el emcas (o lo que quiera que estés usando de editor Sticking out tongue)

Puedes comprobar que funciona de la manera usual.

$ python ejemplo.py

Referencias

La página oficial de Glade: descargas, documentación, etc.
- http://glade.gnome.org/
La página oficial de PyGTK: descargas, documentación, tutoriales, etc.
- http://www.pygtk.org
Información sobre LibGlade: documentación sobre la API.
- http://developer.gnome.org/doc/API/libglade/libglade.html

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

¡Muchas gracias!

Muchas gracias por el tutorial. Me ha sido muy útil para comenzar a dar mis primeros pasos en Glade con Python.

Le he hecho una pequeña modificación que tal vez le pueda ser útil a alguien. Si se añade al código la línea:

self.glade.get_widget('label1').set_text('hola')

después de:

def on_button1_clicked(self, widget):

en vez de:

gtk.main_quit()

al pulsar en el botón, cambia el texto del label.

¡Gracias por todo!

Imagen de brue

wxwidgets...

Yo prefiero wxwidgets ya que tiene soporte nativo para muchas plataformas. Si usas gtk en win32 u OSX, hay una capa más entre el gestor de ventanas de windows y el de osx (en realidad creo que entre los gdi's). Esto hace que cuando usas gtk1 o 2 para crear programas multiplataforma, parezcan ajenos a la plataforma en la que se ejecuta excepto en el tándem kernel de gnu + xwindows.

Te aconsejo que le eches un vistazo.

Gracias por el tutorial.

--
·brue
·vigilando

brue

aclaraciones

Si dices que gtk usa una capa más en SOs donde gtk no es el toolkit nativo, debes mencionar que wxwidgets usa una capa más en todos los sistemas operativos. Basicamente wx es como una capa sobre la interfaz por defecto del SO. Hay que notar las varias aplicaciones hechas en GTK que han sido portadas a win32, como el GIMP, Abiword, entre otras. Es verdad que la instalación en windows del Runtime environment es molesto, sin embargo eso se compensa, y sobre todo comparado a wxwidgets, con la facilidad que se tiene a la hora de programar. Wx se siente como programando en C++ ya que el wrapper no aprovecha para nada python. Aparte de eso, a pesar de que se tienen los XRC, eso no es nada comparable a la libglade con glade. Sino, traten de hacer el ejemplo del tutorial con XRC.

Sin embargo, wx tiene una gran cantidad de widgets a su disposición que es una de las ventajas que tiene, aparte de que (aunque no me parece una ventaja) se ve nativo en cada plataforma.

Imagen de int-0

wxwidgets portable?

Hasta lo que leí... wxwidgets eran una implementación libre de los controles propietarios estándar de M$ Hassefroch, creo que son tan multiplaformas como lo son GTK entonces... no?

Wxwidgets están recomendados para migrar aplicaciones de hassefroch a s.o. más profesionales. Para escribir una aplicación desde 0 creo que son un coñazo (se puede decir coñazo a estas horas?)... pero claro, también podrías escribir una receta que me demostrase lo contrario... Sticking out tongue

Ale... taluego...

P.D. La wii mola... perdón, la wii no... su mando si!
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de brue

wxWidgets...

wxWidgets lets developers create applications for Win32, Mac OS X,
GTK+, X11, Motif, WinCE, and more  using one codebase. It can be used
from languages such as C++, Python, Perl, and C#/.NET. Unlike other 
cross-platform toolkits, wxWidgets applications look and feel native. 
This is because wxWidgets uses the platform's own native controls 
rather than emulating them. It's also extensive, free, open-source, 
and mature.


·brue
·vigilando

brue

Imagen de david.villa

¿Y por qué..

querría nadie en sus cabales desarrollar para una plataforma no-GNU? Yo te aconsejo que dejes de echar vistazos a windows/MacOS...

GTK rulez!

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de brue

porque...

el kernel de gnu (esto es, Linux) es una mierda Smiling

y porque todo el mundo tiene que tener el derecho de usar software libre, esté preso por windows/osx/... o incluso linux.

Quizá una empresa te pida desarrollar un programa que corra bajo win32 y tu quieras usar la potencia de gnu y no quieras que tu aplicación sea fea.

Un saludo, ... y pruébalo oscarh Smiling

Muerte a Wii!
--
·brue
·vigilando

brue

Imagen de david.villa

Cierto

el kernel de gnu (esto es, Linux) es una mierda

no entiendo qué relación tiene. Como Linux es una mierda ¿vamos a dar soporte a otros SO que son más mierdas y encima privativos? Sinceramente, no veo la relación por mucho que la busco.

y porque todo el mundo tiene que tener el derecho de usar software libre, esté preso por windows/osx/… o incluso linux.

Vale, son libres de portarlo ellos. Y también son libres de cambiarse a un SO libre.

Quizá u_na empresa te pida desarrollar un programa que corra bajo win32 y tu quieras usar la potencia de gnu y no quieras que tu aplicación sea fea.

hombre, si te pagan bien bien haces lo que sea…

No hay que perder el rumbo. El objetivo del sofware libre está claro: acabar, destruir y aniquilar para siempre el software propietario. Eso no se consigue haciendo más software libre que corra sobre plataformas privativas.

No me parece mal que exista software portable a “loquesea”. Lo que me parece mal es que tengamos que tomarnos la mínima molestia para conseguir que nuestro programa libre funcione en Windows. Es un desperdicio de tiempo y de trabajo. Obviamente cada uno decide en qué malgastar su tiempo y yo no soy quién para prohibirlo.

¿Tú vas a usar el programa en Windows o en MacOS? Verdad que no? Pues entonces, el que lo necesite en Windows que lo haga portable, bienvenida será su aportación, para eso es software libre y cualquiera dispone de los fuentes.

oscarah, ni caso, sigue con tu GTK. Seamos consecuentes. Hagamos SL con herramientas libres para SO libres.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de oscarah

Vaya!

No duscutamos. No voy a abandonar GTK (me encantan), pero también puedo usar wxWidgets en GNU, son libres. Hala, todos contentos. Sticking out tongue

PD: con eso no digo que me esfuerce para hacer mi software "bonito" bajo windows, si no se ve "bonito", que instalen algo GNU para que si se vea "bonito".

________________________________________________
La "L" de "CRySoL" es de "Libre" no de "Linux".

"aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto" --GCC 4.3.1

Imagen de david.villa

Lo has 'clavao'

Es justo lo que yo quería decir, pero en menos palabras.

PD: Por cierto, no me gusta tu receta Sticking out tongue

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de brue

sí ...

lo ha clavado porque ha aclarado que wxwidgets es libre.

Si haces un programa en python y gtk, no creo que haya que hacer mucho curro para portarlo. Y si lo haces en python + wxwidgets, tampoco. La diferencia es que wxwidgets se verá bien siempre (y esto incluye SO privativos y no privativos). Tu sigue usando lo que quieras David, pero no le digas "ni caso" ... porque yo lo único que he dicho es "echa un vistazo" y que él decida. Está claro que si quiere hacer un programa para gnu/linux pues que use gtk ... o no está tan claro??

Aparte, hay mucho SL que se desarrolla en win32; ya, no es el zen de la coherencia, pero si en vez de usar los controles de ventana de windows, pusieran por medio a wxwidgets, no habría tantos problemas para portar aplicaciones. Vease el ejemplo de uTorrent, un cliente de bittorrent super ligero.

Si se puede hacer portable y bonito, no entiendo cuál es el problema ético que implica. Si puedes ayudar a que lo use todo el mundo, hasta los sujetos a la tiranía de M$, cuál es el problema? GNU es un sistema, no un kernel. GNU en este momento, es el conjunto de aplicaciones que acompañan a linux, qué tiene de malo que exista EMACS para win32? Yo no le veo nada negativo.

Si tanto le jode a la gente que se use GNU con kernels diferentes de linux, y luego los puristas nos quejamos del "microkernel" linux... ¿por qué no se desarrolla HURD más rápido?
"Depende del tiempo que usted le dedique a ello" ... muy altruista señor Stallman. La portabildad es BUENA. X11 es una mierda como una casa, y estallará igual que lo hará linux. Por eso, cuanto más portable sea una aplicación, mejor.

--
·brue
·vigilando

brue

Imagen de int-0

X11 una mierda?

El protocolo X11 una mierda? me parece que esa es una afirmación muy a la ligera producto quizá de alguna laguna. Infórmate... el protocolo X11 es una idea genial y significó un gran avance que ni windows ni mac han alcanzado todavía. Las distintas implementaciones pueden ser mejores o peores pero desde luego X11 es una pequeña maravilla... y lo seguirá siendo...

Al margen de que tu tengas transparencias, sombras y demás polleces.
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de brue

Je ...

No hablo del protocolo, que critico también por cierto, sino de la implementación hasta que ha llegado xorg. Cualquier versión de xfree era xploitable, y dudo que xorg no sea igual. Para evitar todos esto conflictos intrísecos al protocolo, distribuciones como debian toman la determinación de que tengas que autorizar las conexiones TCP/IP de forma implícita (ellos mismos no confían mucho).

No hablo de cosas "bonitas" porque para mi criterio, un desktop plano y sin tonterías es mucho más usable que cubos en 3d o que las otras mil chorradas. De hecho, creo que algunas interfaces de usuario van hacia atrás en usabilidad. Yo por ejemplo, estaba más agusto con alguna versión anterior de Nautilus. Y, ¿quién no usa algún browser estilo mc? (que creo que está basado en dosshell). La X petarán y habrá que portar código. Tiempo al tiempo. Yo sinceramente apostaría por otras soluciones para cuando HURD esté listo. Quién usa las X para hacer tareas remotas? No hay otras formas más seguras de hacerlo? Puede que la idea esté bien, pero seguro que se puede implementar de forma mucho más ligera. ¿Por qué todo el mundo ha de usar un servidor X11 para tener un desktop con GNU? Esto va a cambiar, os lo aseguro. Y si no, de nuevo, tiempo al tiempo.

Puristas no quiere decir anticambio.

--
·brue
·vigilando

brue

Imagen de int-0

Cualquier versión de xfree

Cualquier versión de xfree era xploitable, y dudo que xorg no sea igual.

Si ese criterio se usase para decidir si un programa es bueno o no... cuantos programas podríamos usar? Claro que es un problema para un programa pero para eso están los bugtracks y demás... Eye-wink

Para evitar todos esto conflictos intrísecos al protocolo, distribuciones como debian toman la determinación de que tengas que autorizar las conexiones TCP/IP de forma implícita (ellos mismos no confían mucho).

Cuando te instalas cualquier servidor de ftp, algún MTA, etc. sólo están a la escucha en 127.0.0.1, es decir, no están directamente accesibles desde el exterior... es que no confían en ellos? no... a diferencia de hassefroch... no van a empezar a abrir puertos a porrillo así porque así... requiere la acción de un administrador para ello.

El VNC ha tenido éxito, lo ves en instalaciones "profesionales", se porta a muchas plataformas... lo tienes incluso para servidores X (cuando ese tipo de uso lo implementan de forma nativa). Por tanto, algo de interés existirá en poder trabajar de forma remota en escritorios, no? Y aunque esto no fuera así, el protocolo X11 (sigo pensando que otra gran aportación del MIT) es una idea genial: desacopla el dibujado de un escritorio de todo lo que haya por debajo, aporta un conjunto estándar de primitivas para el dibujado de entornos de escritorio, es portable, etc.

No entiendo porqué dices que el protocolo X11 debe petar, si me parece una idea genial... que otra forma de hacerlo propones? que el dibujado de elementos lo haga el gestor de ventanas con el driver, como se hace en hassefroch? a mi me parece que X11 es la capa que hace falta, más capas puede ser demasiada carga y menos capas es una chapuza...
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de david.villa

Cierto

Todos los puristas queremos que cambies. O que vuelvas a ser el que eras antes de comprarte el ibook ;-(

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de david.villa

Definiciones

GNU en este momento, es el conjunto de aplicaciones que acompañan a linux

¿Eso debe tomarse como una definición?

Si se puede hacer portable y bonito, no entiendo cuál es el problema ético que implica.

Yo no he dicho que sea un problema ético, es un problema práctico.

La portabildad es BUENA

Claro que sí, yo no he dicho lo contrario, pero que la haga el que la necesite. ¿Por qué utilizas argumentos con los que estoy de acuerdo? Si me quieres dar la razón dilo ya y dejamos de discutir Sticking out tongue

Si tú (bueno, tú si) no vas a usar la aplicación en un sistema propietario, ¿qué más te da si es portable o no? Preocuparse por la portabilidad cuando no vas a ser beneficiario directo de ella es una perdida de tiempo y esfuerzo.

oscarah, ni caso, este tío usa MacOSX Sticking out tongue

PD: No entiendo lo que dices de RMS, según tengo entendido a él también le parece bien malgastar esfuerzos para lograr portabilidad. Vamos, que está de acuerdo contigo. ¿Por qué le atacas?


No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de brue

problemas prácticos?

Si en el colectivo GNU no estuvieramos acostumbrados a toparnos con situaciones en las que se dan ese tipo de problemas ... ¿dónde estaría el software libre? No entiendo, pero llevas razón. Supongo.

Pero oscarh, tu prueba wxwidgets Eye-wink y luego decides qué usar según el proyecto. Es SL así que no hay problema. No hagas caso a los linuxeros Eye-wink

--
·brue
·vigilando

brue

Imagen de david.villa

A ver...

Aclaremos, yo no tengo nada en contra de wxwindows ni de ninguna otra cosa mientras sea LIBRE. Lo que no estoy de acuerdo es en los motivos que tu expones para usarlo. No dices que sea más potente, más fiable o más fácil, que puede que lo sea. Tu único argumento es que se ve más bonito ¡en los SO privativos!

Y por muy mierda que sea Linux y por mucho que yo lo deteste, Linux es una mierda libre. Y siempre será mil veces mejor usar una mierda libre que una maravilla privativa, al menos si eres de los que de verdad se creen esto del SL. Si te la suda la libertad, obviamente preferirás usar MacOSX que es más bonito, está mejor hecho y funciona mejor.

PD: Me has llamado 'linuxero'... ahí ya te has 'pasao', ¿ves tú? No te lo tengo en cuenta porque sé que la manzana de 'eipol' nubla tu entendimiento. Eye-wink

PD2: Y yo me planto, que vamos a exceder el nivel de indentación de drupal, que es una kk.

--
No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de brue

:)

Jajajaja! Sabía que lo de linuxero iba a hacer daño Eye-wink

Y no uso OSX. Pero sí, es más bonito Sad

--
·brue
·vigilando

brue

Imagen de oscarah

Llevas toda la razón

No conozco wxwidgets (de momento Smiling), pero si he experimentado el problema de extender GTK a otras plataformas. Mayormente escribí esto porque un amiguete me dijo que necesitaba un curso acelerado de GTK+ y Glade. Yo si uso GTK+ pero como suelo usarlo solo bajo "cosas" GNU, pues no he tenido mayor inconveniente.

Gracias por tu comentario, prometo hecharle un vistazo a los wxwidgets!

________________________________________________
La "L" de "CRySoL" es de "Libre" no de "Linux".

"aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto" --GCC 4.3.1