{"id":29,"date":"2007-08-28T01:00:13","date_gmt":"2007-08-27T23:00:13","guid":{"rendered":"http:\/\/blog.rastersoft.com\/index.php\/2007\/08\/28\/escribiendo-con-pygtk-como-deity-manda\/"},"modified":"2007-08-28T01:00:13","modified_gmt":"2007-08-27T23:00:13","slug":"escribiendo-con-pygtk-como-deity-manda","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=29","title":{"rendered":"Escribiendo con PyGTK como $DEITY manda"},"content":{"rendered":"<p>Hoy he lanzado una nueva versi\u00f3n de Z88Transfer. Los cambios observables por los usuarios son m\u00e1s bien peque\u00f1os: ahora muestra una barra de progreso durante la transferencia, permite transferir varios archivos de una sola tacada, comprueba m\u00e1s exhaustivamente si un archivo nuevo sobreescribe a uno viejo, y, sobre todo, simplifica much\u00edsimo su uso en windows.<\/p>\n<p>Sin embargo, por dentro los cambios son mucho m\u00e1s radicales, pues pr\u00e1cticamente he reescrito la aplicaci\u00f3n. Las razones han sido tres:<\/p>\n<ul>\n<li>Por un lado, varias partes del c\u00f3digo estaban muy sucias y eran muy poco modulares.<\/li>\n<li>Por otra, quer\u00eda internacionalizar la aplicaci\u00f3n, para poder traducirla a otros idiomas (aunque en esta versi\u00f3n todav\u00eda no hay traducciones).<\/li>\n<li>Por \u00faltimo, quer\u00eda organizar en condiciones el c\u00f3digo de las ventanas poniendo los manejadores de eventos de cada una en su propia clase (haci\u00e9ndolo as\u00ed m\u00e1s modular mantenible), adem\u00e1s de simplificarlo usando di\u00e1logos para los distintos mensajes que pueden aparecer, en lugar de ventanas modales.<\/li>\n<\/ul>\n<p>La \u00faltima raz\u00f3n es especialmente importante. En el caso de SuperShow, el c\u00f3digo era ya bastante bueno pues es la \u00faltima aplicaci\u00f3n que he escrito hasta la fecha, pero en el caso de Z88Transfer el c\u00f3digo era realmente sucio, pues fue la primera aplicaci\u00f3n que hice con PyGTK. Sin embargo, gracias a que es una aplicaci\u00f3n relativamente sencilla, el c\u00f3digo a\u00fan era razonable (la transferencia de ficheros y la conversi\u00f3n de formatos van en sendas clases separadas, lo que simplific\u00f3 la reescritura).<\/p>\n<p>\u00bfY a qu\u00e9 viene \u00e9sto? Pues viene porque tambi\u00e9n estoy reescribiendo el c\u00f3digo de DeVeDe. Cuando comenc\u00e9 a escribir con PyGTK no sab\u00eda como generar una \u00fanica ventana ni como conectar los eventos de \u00e9sta con m\u00e9todos de una clase, pues la documentaci\u00f3n del m\u00f3dulo PyGlade era escasa, por no decir nula. El resultado fue que la \u00fanica manera que ten\u00eda de programar era generando una instancia de absolutamente todas las ventanas disponibles en el archivo de Glade, y metiendo todas las funciones de eventos directamente en un \u00fanico fichero, lo que dio lugar a un c\u00f3digo&#8230; bueno, llam\u00e9moslo ca\u00f3tico (por ser ben\u00e9volo conmigo mismo), y muy poco mantenible.<\/p>\n<p>Ahora lo veo en retrospectiva y me parece increible que haya sido capaz de escalar el c\u00f3digo original de DeVeDe hasta el nivel actual, aunque siendo yo el programador supongo que no tiene mucho m\u00e9rito. El que s\u00ed que tiene m\u00e9rito es, sin duda, Peter Gill, que lo revis\u00f3 y modific\u00f3 para que funcionase tambi\u00e9n en windows. Un c\u00f3digo que fue escrito originalmente como una soluci\u00f3n chapucera y r\u00e1pida para hacerle con comodidad a mi madre una peque\u00f1a colecci\u00f3n de DVDs con los programas de Argui\u00f1ano que bajaba de la mula.<\/p>\n<p>En estos momentos ya he reescrito toda la parte de conversi\u00f3n de v\u00eddeos y de generaci\u00f3n de la imagen de DVD usando una orientaci\u00f3n a objetos bastante razonable, y posiblemente lance una versi\u00f3n s\u00f3lo con esas modificaciones, pues el nuevo c\u00f3digo deber\u00eda ser mucho m\u00e1s resistente a fallos tontos (el propio Peter, cuando lo revis\u00f3 para asegurarse de que funcionase en Windows, coment\u00f3 que ser\u00eda una tarea much\u00edsimo m\u00e1s sencilla gracias a la nueva arquitectura). El siguiente paso ser\u00e1 cambiar a una clase independiente todo el c\u00f3digo de la ventana de propiedades de  los v\u00eddeos, para permitir a\u00f1adir con m\u00e1s facilidad nuevas opciones de codificaci\u00f3n. Por \u00faltimo, meter\u00e9 en su propia clase la ventana principal y pondr\u00e9 la ventana de selecci\u00f3n de tipo de disco como un di\u00e1logo. Entonces podr\u00e9 dar por terminada la refactorizaci\u00f3n del c\u00f3digo y seguir a\u00f1adiendo cosas nuevas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy he lanzado una nueva versi\u00f3n de Z88Transfer. Los cambios observables por los usuarios son m\u00e1s bien peque\u00f1os: ahora muestra una barra de progreso durante la transferencia, permite transferir varios archivos de una sola tacada, comprueba m\u00e1s exhaustivamente si un archivo nuevo sobreescribe a uno viejo, y, sobre todo, simplifica much\u00edsimo su uso en windows. &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=29\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Escribiendo con PyGTK como $DEITY manda<\/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":[3],"tags":[],"class_list":["post-29","post","type-post","status-publish","format-standard","hentry","category-nueva-version"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/29","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=29"}],"version-history":[{"count":0,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/29\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}