{"id":106,"date":"2009-04-23T01:23:56","date_gmt":"2009-04-22T23:23:56","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=106"},"modified":"2015-08-15T18:00:09","modified_gmt":"2015-08-15T18:00:09","slug":"llega-gtkbuilder","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=106","title":{"rendered":"Llega GtkBuilder"},"content":{"rendered":"<p><strong>Actualizado. <\/strong>Acabo de terminar una nueva versi\u00f3n de DeVeDe; sin embargo no os abalanceis como locos a por ella porque todav\u00eda no est\u00e1 disponible. La raz\u00f3n es que uno de los (pocos) cambios que hice fue migrar el c\u00f3digo a <a href=\"http:\/\/library.gnome.org\/devel\/gtk\/unstable\/GtkBuilder.html\" target=\"_blank\">GtkBuilder<\/a>; el problema es que varias de las funcionalidades que aporta se han a\u00f1adido en la nueva GTK 2.16, la cual viene en Ubuntu 9.04, la cual no sale oficialmente hasta ma\u00f1ana. Eso significa que si saco ahora esta nueva versi\u00f3n, nadie podr\u00e1 usarla a menos que (como yo) instale una versi\u00f3n <em>Release Candidate<\/em> de Ubuntu. Por esa raz\u00f3n no la sacar\u00e9 hasta el s\u00e1bado (por aquello de dar tiempo a la gente a que migre de manera calmada y ordenada).<\/p>\n<p>Sin embargo, aprovecho para escribir una breve introducci\u00f3n a GtkBuilder (breve porque tampoco hay mucho que explicar, es muy sencilla de usar).<\/p>\n<p><strong>\u00bfQu\u00e9 es GtkBuilder?<\/strong><\/p>\n<p>GtkBuilder es una biblioteca que llevar\u00e1 a cabo las mismas funciones que actualmente realiza <a href=\"http:\/\/en.wikipedia.org\/wiki\/Libglade\" target=\"_blank\">LibGlade<\/a>: a partir de una serie de ficheros XML creados con Glade u otro editor, generar\u00e1 las ventanas de una aplicaci\u00f3n, incluyendo todos sus widgets internos.<\/p>\n<p><strong>\u00bfPero si va a hacer las mismas funciones, por qu\u00e9 sacar una nueva biblioteca en lugar de seguir con la vieja?<\/strong><\/p>\n<p>Por una raz\u00f3n 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\u00eda sentido que una biblioteca tan fundamental fuese un elemento externo. Por \u00faltimo, aunque LibGlade siempre funcion\u00f3 muy bien y est\u00e1 bien implementada, hab\u00eda algunas cosas que se pod\u00edan mejorar.<\/p>\n<p>Por todo \u00e9sto los desarrolladores de GTK decidieron crear una biblioteca integrada en GTK y que fuese lo m\u00e1s parecida posible a LibGlade, con el objetivo de reemplazarla: GtkBuilder hab\u00eda nacido.<\/p>\n<p><strong>Trabajando con GtkBuilder<\/strong><\/p>\n<p>La forma de trabajar con GtkBuilder es muy similar a LibGlade. La principal diferencia es que en GtkBuilder no es posible generar s\u00f3lo una parte del \u00e1rbol (aunque se est\u00e1n planteando el soportar esta opci\u00f3n). Esto significa que es m\u00e1s eficiente poner cada ventana en un fichero XML independiente.<\/p>\n<p>Si ya tienes un fichero <em>.glade<\/em> puedes convertirlo f\u00e1cilmente al nuevo formato usando el script <strong><em>gtk-builder-convert<\/em><\/strong>. Como primer par\u00e1metro recibe el fichero <em>.glade<\/em> a convertir; como segundo par\u00e1metro, el fichero de salida en formato GtkBuilder; por \u00faltimo, opcionalmente se le puede pasar un par\u00e1metro <em>-r <\/em> seguido del identificador de un widget (usualmente una ventana), de manera que s\u00f3lo convertir\u00e1 dicho widget y todos sus hijos. Esta \u00faltima opci\u00f3n permite separar una antigua interfaz Glade con todas las ventanas en un \u00fanico fichero, en varios ficheros GtkBuilder, cada uno con una sola ventana.<\/p>\n<p>Un ejemplo: <em>gtk-builder-convert viejo_proyecto.glade ventana_ppal.ui -r main_win<\/em> crear\u00e1 un fichero <em>ventana_ppal.ui<\/em> que contendr\u00e1 la ventana <em>main_win<\/em> y todos sus elementos, del proyecto <em>viejo_proyecto.glade<\/em>.<\/p>\n<p>Por cierto, la extensi\u00f3n de los nuevos archivos es <strong><em>.ui<\/em><\/strong>. Es un detalle que me cost\u00f3 encontrar.<\/p>\n<p>La primera gran diferencia con Glade es que no hace falta importar ning\u00fan m\u00f3dulo, pues ya est\u00e1 dentro de GTK.<\/p>\n<p>Trabajar con GtkBuilder es tan sencillo como:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">class MiClase:\r\n    __init__(self):\r\n        builder=gtk.Builder()\r\n        builder.set_translation_domain(\"mi_aplicacion\")\r\n        builder.add_from_file(\"path\/to\/file.ui\")\r\n        builder.connect_signals(self)\r\n        ventana=builder.get_object(\"nombre_ventana\")<\/pre>\n<\/div>\n<p>En la primera l\u00ednea creamos un objeto de tipo GtkBuilder; en la segunda especificamos cual es el nombre de nuestra aplicaci\u00f3n de cara a usar <em>GETTEXT<\/em> para las locales; a continuaci\u00f3n le indicamos qu\u00e9 fichero <em>.ui<\/em> contiene la definici\u00f3n de la interfaz que queremos generar. Estas tres l\u00edneas reemplazan a la \u00fanica l\u00ednea que utiliz\u00e1bamos con LibGlade.<\/p>\n<p>En la siguiente l\u00ednea le indicamos que conecte las se\u00f1ales con los m\u00e9todos de nuestra clase; es igual que el m\u00e9todo <em>signal_autoconnect<\/em> de LibGlade.<\/p>\n<p>Por \u00faltimo, pedimos una referencia a un objeto concreto; es igual que el viejo m\u00e9todo <em>get_widget<\/em> de LibGlade.<\/p>\n<p><strong>Trabajando con Glade<\/strong><\/p>\n<p>Las nuevas versiones de Glade-3 no s\u00f3lo soportan el nuevo formato, sino que incluso trabajan por defecto en \u00e9l. En general se sigue trabajando exactamente igual que antes; la \u00fanica diferencia es que es recomendable que cada ventana vaya en un fichero (y, por tanto, en un proyecto) diferente.<\/p>\n<p>Un detalle muy interesante es la comprobaci\u00f3n del soporte de versiones de GTK en el nuevo Glade: si tenemos abierta una interfaz y escogemos <em>Editar-&gt;Preferencias<\/em>, nos saldr\u00e1 el siguiente cuadro de di\u00e1logo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-111\" title=\"glade\" src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2009\/04\/glade.png\" alt=\"glade\" width=\"492\" height=\"494\" \/><\/p>\n<p>En la parte inferior vemos la opci\u00f3n <strong>Versiones de los toolkit necesarias<\/strong>. Dicha opci\u00f3n nos permite comprobar si en esta interfaz estamos usando algun widget que no est\u00e9 soportado por alguna versi\u00f3n antigua de GTK o de GtkBuilder. Esto es precisamente lo que me ocurri\u00f3 con esta versi\u00f3n de DeVeDe: el nuevo constructor de men\u00fas s\u00f3lo est\u00e1 soportado a partir de GTK 2.16, que viene a partir de Ubuntu 9.04.<\/p>\n<p>En otra entrada explicar\u00e9 como se trabaja con las <strong>GtkComboBox<\/strong> y sus listas asociadas, pues GtkBuilder permite generar todo desde Glade, sin necesidad de picar apenas c\u00f3digo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Actualizado. Acabo de terminar una nueva versi\u00f3n de DeVeDe; sin embargo no os abalanceis como locos a por ella porque todav\u00eda no est\u00e1 disponible. La raz\u00f3n es que uno de los (pocos) cambios que hice fue migrar el c\u00f3digo a GtkBuilder; el problema es que varias de las funcionalidades que aporta se han a\u00f1adido en &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=106\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Llega GtkBuilder<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,7],"tags":[],"class_list":["post-106","post","type-post","status-publish","format-standard","hentry","category-programacion","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=106"}],"version-history":[{"count":1,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/106\/revisions"}],"predecessor-version":[{"id":1899,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/106\/revisions\/1899"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}