Llega GtkBuilder

Actualizado. Acabo de terminar una nueva versión de DeVeDe; sin embargo no os abalanceis como locos a por ella porque todavía no está disponible. La razón es que uno de los (pocos) cambios que hice fue migrar el código a GtkBuilder; el problema es que varias de las funcionalidades que aporta se han añadido en la nueva GTK 2.16, la cual viene en Ubuntu 9.04, la cual no sale oficialmente hasta mañana. Eso significa que si saco ahora esta nueva versión, nadie podrá usarla a menos que (como yo) instale una versión Release Candidate de Ubuntu. Por esa razón no la sacaré hasta el sábado (por aquello de dar tiempo a la gente a que migre de manera calmada y ordenada).

Sin embargo, aprovecho para escribir una breve introducción a GtkBuilder (breve porque tampoco hay mucho que explicar, es muy sencilla de usar).

¿Qué es GtkBuilder?

GtkBuilder es una biblioteca que llevará a cabo las mismas funciones que actualmente realiza LibGlade: a partir de una serie de ficheros XML creados con Glade u otro editor, generará las ventanas de una aplicación, incluyendo todos sus widgets internos.

¿Pero si va a hacer las mismas funciones, por qué sacar una nueva biblioteca en lugar de seguir con la vieja?

Por una razón muy simple: LibGlade no forma parte de GTK, sino que sigue un desarrollo completamente independiente. Eso la limita en algunos aspectos (por ejemplo, velocidad a la hora de soportar nuevos widgets y propiedades). Por otro lado, no tenía sentido que una biblioteca tan fundamental fuese un elemento externo. Por último, aunque LibGlade siempre funcionó muy bien y está bien implementada, había algunas cosas que se podían mejorar.

Por todo ésto los desarrolladores de GTK decidieron crear una biblioteca integrada en GTK y que fuese lo más parecida posible a LibGlade, con el objetivo de reemplazarla: GtkBuilder había nacido.

Trabajando con GtkBuilder

La forma de trabajar con GtkBuilder es muy similar a LibGlade. La principal diferencia es que en GtkBuilder no es posible generar sólo una parte del árbol (aunque se están planteando el soportar esta opción). Esto significa que es más eficiente poner cada ventana en un fichero XML independiente.

Si ya tienes un fichero .glade puedes convertirlo fácilmente al nuevo formato usando el script gtk-builder-convert. Como primer parámetro recibe el fichero .glade a convertir; como segundo parámetro, el fichero de salida en formato GtkBuilder; por último, opcionalmente se le puede pasar un parámetro -r seguido del identificador de un widget (usualmente una ventana), de manera que sólo convertirá dicho widget y todos sus hijos. Esta última opción permite separar una antigua interfaz Glade con todas las ventanas en un único fichero, en varios ficheros GtkBuilder, cada uno con una sola ventana.

Un ejemplo: gtk-builder-convert viejo_proyecto.glade ventana_ppal.ui -r main_win creará un fichero ventana_ppal.ui que contendrá la ventana main_win y todos sus elementos, del proyecto viejo_proyecto.glade.

Por cierto, la extensión de los nuevos archivos es .ui. Es un detalle que me costó encontrar.

La primera gran diferencia con Glade es que no hace falta importar ningún módulo, pues ya está dentro de GTK.

Trabajar con GtkBuilder es tan sencillo como:

class MiClase:
    __init__(self):
        builder=gtk.Builder()
        builder.set_translation_domain("mi_aplicacion")
        builder.add_from_file("path/to/file.ui")
        builder.connect_signals(self)
        ventana=builder.get_object("nombre_ventana")

En la primera línea creamos un objeto de tipo GtkBuilder; en la segunda especificamos cual es el nombre de nuestra aplicación de cara a usar GETTEXT para las locales; a continuación le indicamos qué fichero .ui contiene la definición de la interfaz que queremos generar. Estas tres líneas reemplazan a la única línea que utilizábamos con LibGlade.

En la siguiente línea le indicamos que conecte las señales con los métodos de nuestra clase; es igual que el método signal_autoconnect de LibGlade.

Por último, pedimos una referencia a un objeto concreto; es igual que el viejo método get_widget de LibGlade.

Trabajando con Glade

Las nuevas versiones de Glade-3 no sólo soportan el nuevo formato, sino que incluso trabajan por defecto en él. En general se sigue trabajando exactamente igual que antes; la única diferencia es que es recomendable que cada ventana vaya en un fichero (y, por tanto, en un proyecto) diferente.

Un detalle muy interesante es la comprobación del soporte de versiones de GTK en el nuevo Glade: si tenemos abierta una interfaz y escogemos Editar->Preferencias, nos saldrá el siguiente cuadro de diálogo:

glade

En la parte inferior vemos la opción Versiones de los toolkit necesarias. Dicha opción nos permite comprobar si en esta interfaz estamos usando algun widget que no esté soportado por alguna versión antigua de GTK o de GtkBuilder. Esto es precisamente lo que me ocurrió con esta versión de DeVeDe: el nuevo constructor de menús sólo está soportado a partir de GTK 2.16, que viene a partir de Ubuntu 9.04.

En otra entrada explicaré como se trabaja con las GtkComboBox y sus listas asociadas, pues GtkBuilder permite generar todo desde Glade, sin necesidad de picar apenas código.

CC BY-SA 4.0 Llega GtkBuilder por A cuadros está licenciado bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.

18 comentarios en “Llega GtkBuilder

  1. Hola.

    Probé creando una ventana en glade y lo guarde como ventana.glade.
    Luego la convertí a ui con gtk-builder-convert y me creó el archivo ventana.ui.
    Lo que no me resultó fué utilizar la opción –root.
    Lo hice así :

    $gtk-builder-convert –root ventana.glade ventana.ui

    Esto no resultó.
    Te agradecería si pudieras indicarme que estoy haciendo mal.

    Saludos

  2. Hola.

    Ya entendí como funciona.

    Por ejemplo si abro glade y creo 2 ventanas dialog, se nombraran dialog1 y dialog2.
    Si guardo el archivo por ejemplo como interfaz.glade y lo abro con cualquier editor de texto(gedit), me muestra la estructura xml del archivo, en donde se describen las ventanas.
    Ahora si quiero que queden las 2 ventanas dialog separadas en 2 archivos hago lo siguiente:
    me voy a la consola y escribo:

    $gtk-builder-convert -r archivo.glade archivo.ui.

    ej.

    $gtk-builder-convert -r dialog1 interfaz.glade ventanadialogo1.ui
    luego repito cambiando a la otra ventana dialog:

    $gtk-builder-convert -r dialog2 interfaz.glade ventanadialogo2.ui.

    Así nos quedan 2 archivos separados ventanadialogo1 y ventanadialogo2.

    Espero que este bien .

    Saludos

  3. Bueno, como ya habrás descubierto, el script forma parte del paquete de desarrollo de GTK, por lo que ya debería estar en tu sistema.

    Por otro lado, el fallo que creo que has tenido es que la opción «–root» lleva dos guiones, además de que hay que indicar el identificador de la ventana que quieres meter en ese fichero. En lugar de «–root» también se puede poner «-r», como has hecho tú.

    Por lo demás, sí, está correcto. En otra entrada comentaré como se trabaja con los GtkComboBox, que ahora es mucho más sencillo (aunque no se que pasa con los GtkComboBoxEntry, que esos aún no he conseguido que funcionen directamente desde Glade).

  4. Parece que el tipo de letra que uso no permite distinguir bien si es un guion o dos, así que al final he retocado el artículo y he puesto -r, que está más claro, además de un ejemplito como el tuyo.

  5. Hola.

    Gracias por la respuesta.

    Vengo del Mundo de Windows con Visual Basic 6.0.Estuve viendo si se puede crear programas en windows usando Glade y GTK.Parece que se puede.
    Mi duda surge por lo siguiente, en este sitio te ofrecen las versiones de Glade y el Runtime de GTK+. http://gladewin32.sourceforge.net/.
    Al refererirse al runtime, en teoria ¿funciona como Visual Net con su Framework?.
    Si yo quiero crear un programa con GTK+ ¿Necesariamente tengo que decirle al usuario que instale este Runtime.
    En teoria, si se dice que GTK y Glade son multiplatorma ¿no deberian tener paquetes oficiales para windows?.
    Bueno disculpa todas las preguntas, y gracias de nuevo.

    Saludos

  6. Hombre, que GTK y Glade sean multiplataforma no significa que tengan que tener paquetes oficiales para todas las plataformas habidas y por haber, sino que está diseñado para poder ser portado fácilmente a otras plataformas. Para Windows sí hay versiones oficiales en http://www.gtk.org/download-windows.html , pero ojo, porque eso es sólo para trabajar desde C. Si quieres trabajar desde .NET necesitas, además, los bindings para C# y demás, si no me equivoco. Por suerte hay un instalador que te pone absolutamente todo (runtime de GTK y Cairo, y enlaces para C#): http://mkestner.blogspot.com/2009/04/gtk-for-net.html . No es «oficial», en el sentido de que está hecho por terceros, pero oye, menos da una piedra 🙂

    Respecto a si el usuario tiene que instalarse el runtime, me temo que la respuesta es afirmativa, a menos que incluyas tú el runtime en el instalador de tu programa.

  7. Hola.

    Disculpa si mi ultimo post te molesto.Solo pregunto con afan de informarme ;).
    ¿Que opinas de Glade y GTK?, he visto tan pocos manuales en castellano y los
    que existen estan desfazados en por lo menos 6 años que no se si es un herramienta muy conocida. Será porque hay que programar en C.Reconozco que el pasarme de Visual 6 a la sintaxis de GTK, fué un verdadero dolor de muelas.Me gusta la librería y la herramienta GUi(Glade), pero ¿Encuentras que es una herramienta rapida de desarrollo? Te lo pregunto porque he usado tu programa DEVEDE y es una pasada, pero me imagino que no lo desarrollaste de la noche a la mañana.

    Saludos

  8. No me molestan las preguntas, para nada. Puedes preguntar todo lo que quieras (menos sobre mi vida privada; para eso cobro 😀 )

    Respecto a mi opinión, te diré que depende de para qué lo quieras usar. Si quieres trabajar exclusivamente en Windows no tiene sentido que trabajes con GTK, porque quien quiera usar tus programas necesitarán instalar el runtime y algunas dependencias más. Otra cosa es que quieras hacer programas fácilmente portables entre Windows, Linux y MacOS, en cuyo caso puede ser una buena idea. Y, por supuesto, si quieres trabajar principalmente en Linux también es buena idea.

    Por otro lado, es cierto que la documentación en castellano está algo atrasada, pero en inglés tienes mucha y muy actualizada. Ya se que no es tan cómodo, pero…

    Si trabajabas con Visual Basic, a lo mejor te conviene aprender C# o Python (este último es más cercano a Basic, aunque mucho más elegante). GTK# es el sistema de widgets oficial para Mono (que es una implementación libre de .NET para Linux, Windows, MacOS, BSD…). Por otra parte, PyGTK (GTK para Python) está también muy bien soportado (de hecho, DeVeDe está escrito en Python).

    Por último, Glade en sí no es una herramienta de desarrollo rápido, sino sólo parte de ella: es la parte que permite crear las ventanas a golpe de ratón; pero luego aún tendrás que escribir código (en C, C++, C#, Python, Perl… lo que más te guste) que maneje dichas ventanas. Para ello tienes multitud de editores; yo uso Eclipse, pero hay muchos más (Anjuta, por ejemplo, que además integra dentro de sí a Glade, por lo que sí se puede decir que es un RAD).

  9. Hi Marco:

    I want to do some changes in the current conversion subsystem (mainly use more inheritance to make the code much more maintenable and expandable). Since that will affect your work, I think is better to wait until I do that.

    Unfortunately, due to some personal details I won’t be able to do so until two-three weeks in the best case 🙁

    Anyway, if you want to start to examine the code, it’s available in the TAR.BZ2 file, because DeVeDe is written in Python.

  10. Hola. Soy principiante programando, he usado glade con python y me resulto facil, ahora me surgio programar con java+glade. Mis dudas son, creo, por no tener mucha experiencia…no se como arrancar vi un ejemplo en flash muy bueno que usa glade+java+eclipse (es mi idea trabajar asi) pero no consiguo los .jar que se incluyen como librerias del proyecto. Si me alguno me podria dar una ayuda estaria muy agradecido. Saludos.

Responder a raster Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *