<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mariano Guerra's Log (Posts about gtk)</title><link>http://marianoguerra.org/</link><description></description><atom:link href="http://marianoguerra.org/categories/gtk.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Mon, 18 Nov 2024 17:56:43 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Como generar archivos .exe e instaladores para una aplicación python (y pygtk)</title><link>http://marianoguerra.org/posts/201010como-generar-archivos-exe-e/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;div class="document" id="como-generar-archivos-exe-e-instaladores-para-una-aplicacion-python"&gt;&lt;h1 class="title"&gt;Como generar archivos .exe e instaladores para una aplicación python&lt;/h1&gt;&lt;br&gt;&lt;p&gt;Este documento describe los pasos necesarios para crear un archivo ejecutable&lt;br&gt;de una aplicación python y como generar un instalador y una versión portable&lt;br&gt;para dicha instalación.&lt;/p&gt;&lt;p&gt;Este documento asume que la aplicación se basa en GTK pero debería funcionar&lt;br&gt;con menores cambios en otros toolkits.&lt;/p&gt;&lt;div class="section" id="porque-un-instalador"&gt;&lt;h1&gt;porque un instalador&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;se requiere instalar muchos componentes a mano por el usuario final para una sola aplicación&lt;/li&gt;&lt;li&gt;muchos instaladores pequeños&lt;/li&gt;&lt;li&gt;difíciles de encontrar&lt;/li&gt;&lt;li&gt;difícil encontrar las versiones exactas que funcionan en conjunto&lt;/li&gt;&lt;li&gt;requiere instalarlos en un orden definido&lt;/li&gt;&lt;li&gt;rezar&lt;/li&gt;&lt;li&gt;algunas veces incluso haciendo todo bien puede no funcionar&lt;/li&gt;&lt;li&gt;fácil de automatizar y documentar para replicar con cada nueva versión&lt;/li&gt;&lt;li&gt;liberar al usuario final de los problemas para poder usar la aplicación&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="componentes-requeridos"&gt;&lt;h1&gt;componentes requeridos&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;python&lt;/li&gt;&lt;li&gt;todas las librerías utilizadas por la aplicación&lt;/li&gt;&lt;li&gt;py2exe&lt;/li&gt;&lt;li&gt;nsis&lt;/li&gt;&lt;li&gt;tiempo y suerte&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="instaladores"&gt;&lt;h1&gt;instaladores&lt;/h1&gt;&lt;p&gt;aquí se listan los links a los instaladores de todos los componentes usados en el ejemplo.&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;&lt;a class="reference external" href="http://python.org/ftp/python/2.6.6/python-2.6.6.msi"&gt;http://python.org/ftp/python/2.6.6/python-2.6.6.msi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.6.exe/download"&gt;http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.6.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.6.win32-py2.6.exe"&gt;http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.6.win32-py2.6.exe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.20/pygobject-2.20.0.win32-py2.6.exe"&gt;http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.20/pygobject-2.20.0.win32-py2.6.exe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.16/pygtk-2.16.0+glade.win32-py2.6.exe"&gt;http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.16/pygtk-2.16.0+glade.win32-py2.6.exe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.6.exe/download"&gt;http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.6.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Runtime%20Environment/GTK%2B%202.22/gtk2-runtime-2.22.0-2010-10-01-ash.exe/download"&gt;http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Runtime%20Environment/GTK%2B%202.22/gtk2-runtime-2.22.0-2010-10-01-ash.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Themes%20Package/2009-09-07/gtk2-themes-2009-09-07-ash.exe/download"&gt;http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Themes%20Package/2009-09-07/gtk2-themes-2009-09-07-ash.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe?download"&gt;http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe?download&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="orden-de-instalacion"&gt;&lt;h1&gt;orden de instalación&lt;/h1&gt;&lt;p&gt;algunos instaladores son independientes de otros, pero para evitar posibles problemas recomiendo la instalación en el siguiente orden.&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;python&lt;/li&gt;&lt;li&gt;gtk-runtime&lt;/li&gt;&lt;li&gt;gtk2-themes&lt;/li&gt;&lt;li&gt;nsis&lt;/li&gt;&lt;li&gt;pygobject&lt;/li&gt;&lt;li&gt;pycairo&lt;/li&gt;&lt;li&gt;pygtk&lt;/li&gt;&lt;li&gt;pywin32&lt;/li&gt;&lt;li&gt;py2exe&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="tareas-extra"&gt;&lt;h1&gt;tareas extra&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;setear la variable de entorno PATH para agregar el path a la instalación de python&lt;/li&gt;&lt;li&gt;probar la instalación con una pequeña aplicación gtk&lt;/li&gt;&lt;/ul&gt;&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; import gtk&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; w = gtk.Window()&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; l = gtk.Label("asd")&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; w.add(l)&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; w.show_all()&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; gtk.main()&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="section" id="prueba-con-una-aplicacion-de-ejemplo"&gt;&lt;h1&gt;prueba con una aplicación de ejemplo&lt;/h1&gt;&lt;p&gt;Cree un repositorio con una aplicación de ejemplo para probar los pasos, la aplicación esta disponible en github acá:&lt;/p&gt;&lt;p&gt;&lt;a class="reference external" href="http://github.com/marianoguerra/PyGtkOnWindows"&gt;http://github.com/marianoguerra/PyGtkOnWindows&lt;/a&gt;&lt;/p&gt;&lt;div class="section" id="pasos"&gt;&lt;h2&gt;pasos&lt;/h2&gt;&lt;ul class="simple"&gt;&lt;li&gt;descargarla&lt;/li&gt;&lt;li&gt;descomprimirla&lt;/li&gt;&lt;li&gt;ejecutar python setup.py py2exe&lt;/li&gt;&lt;li&gt;copiar los directorios lib y share de la instalación del runtime de gtk (no de la instalación de pygtk) al directorio dist&lt;/li&gt;&lt;li&gt;copiar todos los archivos del directorio dll al directorio dist&lt;/li&gt;&lt;li&gt;borrar los locales y temas no usados de los directorios copiados a dist (yo solo dejo el theme MS-Windows)&lt;/li&gt;&lt;li&gt;crear la siguiente estructura de directorios dentro de dist: etc/gtk-2.0&lt;/li&gt;&lt;li&gt;dentro de ese directorio crear un archivo llamado gtkrc con una linea como la siguiente dentro:&lt;ul&gt;&lt;li&gt;gtk-theme-name = "MS-Windows"&lt;/li&gt;&lt;li&gt;podes cambiar el tema usado manteniendo otro theme dentro de share/themes y cambiando el nombre del theme en gtkrc&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;right click en ejemplo.nsi y seleccionar "Compile NSIS Script"&lt;/li&gt;&lt;li&gt;right click en ejemplo-portable.nsi y seleccionar "Compile NSIS Script"&lt;/li&gt;&lt;li&gt;deberías tener el instalador y la versión portable disponibles&lt;/li&gt;&lt;li&gt;para probar que funciona correctamente, correr el instalador y la versión portable en una instalación de windows sin los paquetes que instalaste anteriormente&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" id="probar-con-una-aplicacion-real"&gt;&lt;h1&gt;probar con una aplicación real&lt;/h1&gt;&lt;p&gt;ahora para sentirlo mas real, creemos un instalador y una versión portable de&lt;br&gt;un programa real, en este caso, un proyecto personal llamado emesene 2&lt;br&gt;(&lt;a class="reference external" href="http://www.emesene.org/"&gt;http://www.emesene.org/&lt;/a&gt;).&lt;/p&gt;&lt;div class="section" id="id1"&gt;&lt;h2&gt;pasos&lt;/h2&gt;&lt;ul class="simple"&gt;&lt;li&gt;descargarlo de &lt;a class="reference external" href="http://github.com/emesene/emesene"&gt;http://github.com/emesene/emesene&lt;/a&gt;&lt;/li&gt;&lt;li&gt;descomprimirlo&lt;/li&gt;&lt;li&gt;copiar setup.py and ez_setup.py al directorio emesene&lt;/li&gt;&lt;li&gt;cd emesene&lt;/li&gt;&lt;li&gt;correr python setup.py py2exe&lt;/li&gt;&lt;li&gt;cd ..&lt;/li&gt;&lt;li&gt;copiar los directorios lib y share de la instalación del runtime de gtk (no de la instalación de pygtk) al directorio dist&lt;/li&gt;&lt;li&gt;copiar todos los archivos del directorio dll al directorio dist&lt;/li&gt;&lt;li&gt;borrar los locales y temas no usados de los directorios copiados a dist (yo solo dejo el theme MS-Windows)&lt;/li&gt;&lt;li&gt;crear la siguiente estructura de directorios dentro de dist: etc/gtk-2.0&lt;/li&gt;&lt;li&gt;dentro de ese directorio crear un archivo llamado gtkrc con una linea como la siguiente dentro:&lt;ul&gt;&lt;li&gt;gtk-theme-name = "MS-Windows"&lt;/li&gt;&lt;li&gt;podes cambiar el tema usado manteniendo otro theme dentro de share/themes y cambiando el nombre del theme en gtkrc&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;right click en emesene.nsi y seleccionar "Compile NSIS Script"&lt;/li&gt;&lt;li&gt;right click en emesene-portable.nsi y seleccionar "Compile NSIS Script"&lt;/li&gt;&lt;li&gt;deberías tener el instalador y la versión portable disponibles&lt;/li&gt;&lt;li&gt;para probar que funciona correctamente, correr el instalador y la versión portable en una instalación de windows sin los paquetes que instalaste anteriormente&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" id="notas"&gt;&lt;h1&gt;notas&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;obtengo algunos de los dlls requeridos de portable python (&lt;a class="reference external" href="http://www.portablepython.com/"&gt;http://www.portablepython.com/&lt;/a&gt;) e inkscape (&lt;a class="reference external" href="http://inkscape.org/"&gt;http://inkscape.org/&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;</description><category>emesene</category><category>gtk</category><category>instalador</category><category>nsis</category><category>portable</category><category>py2exe</category><category>pygtk</category><category>python</category><guid>http://marianoguerra.org/posts/201010como-generar-archivos-exe-e/</guid><pubDate>Sat, 30 Oct 2010 03:39:00 GMT</pubDate></item><item><title>[EN] How to generate .exe files and installers for a python (and pygtk) applications</title><link>http://marianoguerra.org/posts/201010en-how-to-generate-exe-files-and/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;div class="document" id="how-to-generate-exe-files-and-installers-for-a-python-applications"&gt;&lt;h1 class="title"&gt;How to generate .exe files and installers for a python applications&lt;/h1&gt;&lt;br&gt;&lt;p&gt;This document describes the steps required to create an executable file from a&lt;br&gt;python program and how to build an installer and portable file from that&lt;br&gt;application.&lt;/p&gt;&lt;br&gt;&lt;p&gt;The document assumes that the application is based on GTK but it should work&lt;br&gt;with minor changes for other toolkits.&lt;/p&gt;&lt;div class="section" id="why-an-installer"&gt;&lt;h1&gt;why an installer&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;many components are required to install by hand by the end user for a simple application&lt;/li&gt;&lt;li&gt;a lot of small installers&lt;/li&gt;&lt;li&gt;hard to find&lt;/li&gt;&lt;li&gt;hard to match the exact versions that work together&lt;/li&gt;&lt;li&gt;install them in the required order&lt;/li&gt;&lt;li&gt;pray&lt;/li&gt; &lt;li&gt;sometimes even doing everything right it may not work&lt;/li&gt;&lt;li&gt;easy to automate and document to replicate with each new version&lt;/li&gt;&lt;li&gt;free the end user from problems to use the app&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="required-components"&gt;&lt;h1&gt;required components&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;python&lt;/li&gt;&lt;li&gt;all the libraries used by the application&lt;/li&gt;&lt;li&gt;py2exe&lt;/li&gt; &lt;li&gt;nsis&lt;/li&gt;&lt;li&gt;time and luck ;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="installers"&gt;&lt;h1&gt;installers&lt;/h1&gt;&lt;p&gt;here are listed the links to the installers of all the components used in the example.&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;&lt;a class="reference external" href="http://python.org/ftp/python/2.6.6/python-2.6.6.msi"&gt;http://python.org/ftp/python/2.6.6/python-2.6.6.msi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.6.exe/download"&gt;http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.6.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.6.win32-py2.6.exe"&gt;http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.6.win32-py2.6.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a class="reference external" href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.20/pygobject-2.20.0.win32-py2.6.exe"&gt;http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.20/pygobject-2.20.0.win32-py2.6.exe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.16/pygtk-2.16.0+glade.win32-py2.6.exe"&gt;http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.16/pygtk-2.16.0+glade.win32-py2.6.exe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.6.exe/download"&gt;http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.6.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Runtime%20Environment/GTK%2B%202.22/gtk2-runtime-2.22.0-2010-10-01-ash.exe/download"&gt;http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Runtime%20Environment/GTK%2B%202.22/gtk2-runtime-2.22.0-2010-10-01-ash.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Themes%20Package/2009-09-07/gtk2-themes-2009-09-07-ash.exe/download"&gt;http://sourceforge.net/projects/gtk-win/files/GTK%2B%20Themes%20Package/2009-09-07/gtk2-themes-2009-09-07-ash.exe/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe?download"&gt;http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe?download&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="installation-order"&gt;&lt;h1&gt;installation order&lt;/h1&gt;&lt;br&gt;&lt;p&gt;some installers are independent from the others, but to avoid posible problems I recommend the installation in this order.&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;python&lt;/li&gt;&lt;li&gt;gtk-runtime&lt;/li&gt;&lt;li&gt;gtk2-themes&lt;/li&gt;&lt;li&gt;nsis&lt;/li&gt;&lt;li&gt;pygobject&lt;/li&gt;&lt;li&gt;pycairo&lt;/li&gt;&lt;li&gt;pygtk&lt;/li&gt; &lt;li&gt;pywin32&lt;/li&gt;&lt;li&gt;py2exe&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="section" id="extra-tasks"&gt;&lt;h1&gt;extra tasks&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;set the PATH environment variable to add the path to the python installation&lt;/li&gt;&lt;li&gt;test that the installation works with a simple gtk application&lt;/li&gt;&lt;/ul&gt;&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; import gtk&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; w = gtk.Window()&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; l = gtk.Label("asd")&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; w.add(l)&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; w.show_all()&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; gtk.main()&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="section" id="test-with-a-sample-application"&gt;&lt;h1&gt;test with a sample application&lt;/h1&gt;&lt;br&gt;&lt;p&gt;I created a repository with a sample application to test the steps, the application is available in github here:&lt;/p&gt;&lt;p&gt;&lt;a class="reference external" href="http://github.com/marianoguerra/PyGtkOnWindows"&gt;http://github.com/marianoguerra/PyGtkOnWindows&lt;/a&gt;&lt;/p&gt;&lt;div class="section" id="steps"&gt;&lt;h2&gt;steps&lt;/h2&gt;&lt;ul class="simple"&gt;&lt;li&gt;download it&lt;/li&gt;&lt;li&gt;unpack it&lt;/li&gt;&lt;li&gt;run python setup.py py2exe&lt;/li&gt;&lt;li&gt;copy the lib and share directory from the gtk runtime installation  (not the pygtk installation) to the dist directory&lt;/li&gt;&lt;li&gt;copy all the files from the dll directory to the dist directory&lt;/li&gt; &lt;li&gt;remove unused locales and unused themes (I keep only ms theme)&lt;/li&gt;&lt;li&gt;create the following dirs inside dist: etc/gtk-2.0&lt;/li&gt;&lt;li&gt;inside that create a file called gtkrc with a line like this inside:&lt;ul&gt;&lt;li&gt;gtk-theme-name = "MS-Windows"&lt;/li&gt;&lt;li&gt;you can change the theme by keeping that theme inside share/themes and changing the name in gtkrc&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;right click on ejemplo.nsi and select "Compile NSIS Script"&lt;/li&gt;&lt;li&gt;right click on ejemplo-portable.nsi and select "Compile NSIS Script"&lt;/li&gt; &lt;li&gt;you should have the installer and portable versions available&lt;/li&gt;&lt;li&gt;to test that it works correctly, run the installer and portable versions in a windows installation without the packages you installed previously&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" id="test-with-a-real-application"&gt;&lt;h1&gt;test with a real application&lt;/h1&gt;&lt;p&gt;now to make it feel more real let's create an installer and portable versions&lt;br&gt;for a real world program, in this case, a project of mine called emesene 2&lt;br&gt;(&lt;a class="reference external" href="http://www.emesene.org/"&gt;http://www.emesene.org/&lt;/a&gt;).&lt;/p&gt;&lt;div class="section" id="id1"&gt;&lt;h2&gt;steps&lt;/h2&gt;&lt;br&gt;&lt;ul class="simple"&gt;&lt;li&gt;download it from &lt;a class="reference external" href="http://github.com/emesene/emesene"&gt;http://github.com/emesene/emesene&lt;/a&gt;&lt;/li&gt;&lt;li&gt;unpack it&lt;/li&gt;&lt;li&gt;copy setup.py and ez_setup.py to the emesene directory&lt;/li&gt;&lt;li&gt;cd to emesene&lt;/li&gt;&lt;li&gt;run python setup.py py2exe&lt;/li&gt;&lt;li&gt;cd ..&lt;/li&gt;&lt;li&gt;copy the lib and share directory from the gtk runtime installation  (not the pygtk installation) to the dist directory&lt;/li&gt;&lt;li&gt;copy all the files from the dll directory to the dist directory&lt;/li&gt; &lt;li&gt;remove unused locales and unused themes (I keep only ms theme)&lt;/li&gt;&lt;li&gt;create the following dirs inside dist: etc/gtk-2.0&lt;/li&gt;&lt;li&gt;inside that create a file called gtkrc with a line like this inside:&lt;ul&gt;&lt;li&gt;gtk-theme-name = "MS-Windows"&lt;/li&gt;&lt;li&gt;you can change the theme by keeping that theme inside share/themes and changing the name in gtkrc&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;right click on emesene.nsi and select "Compile NSIS Script"&lt;/li&gt;&lt;li&gt;right click on emesene-portable.nsi and select "Compile NSIS Script"&lt;/li&gt; &lt;li&gt;you should have the installer and portable versions available&lt;/li&gt;&lt;li&gt;to test that it works correctly, run the installer and portable versions in a windows installation without the packages you installed previously&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" id="notes"&gt;&lt;h1&gt;notes&lt;/h1&gt;&lt;ul class="simple"&gt;&lt;li&gt;I get some needed dlls from portable python (&lt;a class="reference external" href="http://www.portablepython.com/"&gt;http://www.portablepython.com/&lt;/a&gt;) and inkscape (&lt;a class="reference external" href="http://inkscape.org/"&gt;http://inkscape.org/&lt;/a&gt;)&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;</description><category>emesene</category><category>exe</category><category>gtk</category><category>installer</category><category>nsis</category><category>portable</category><category>py2exe</category><category>pygtk</category><category>python</category><category>windows</category><guid>http://marianoguerra.org/posts/201010en-how-to-generate-exe-files-and/</guid><pubDate>Sat, 30 Oct 2010 03:19:00 GMT</pubDate></item><item><title>webshots - a.k.a. ya tendria que empezar a trabajar :P</title><link>http://marianoguerra.org/posts/201006webshots-aka-ya-tendria-que-empezar/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;y si, esto de estar recibido y a la espera del día que entre a mi nuevo trabajo (solo 15 faltan dias) me da bastante tiempo libre para probar todas esas cosas que cuando estudiaba o trabajaba quedaban "para después".&lt;br&gt;&lt;br&gt;En este caso necesitaba una herramienta para transformar mis presentaciones hechas con &lt;a href="http://marianoguerra.github.com/pepete/"&gt;pepete&lt;/a&gt; a un formato que pueda ser distribuido offline.&lt;br&gt;&lt;br&gt;pensé dos cosas, bajarlo a imágenes o a pdfs y como no me decidía hice las dos.&lt;br&gt;&lt;br&gt;El resultado es &lt;a href="http://github.com/marianoguerra/webshot"&gt;webshot&lt;/a&gt;, quizás le sea útil a alguien, quizás no, que importa, el código esta ahí :D.&lt;br&gt;&lt;br&gt;webshot es un webkit adentro de una ventana gtk que tiene algunos bindings útiles como ir a fullscreen, guardar la porción visible de la pantalla a png o pdf y no mucho mas.&lt;br&gt;&lt;br&gt;esta herramienta me permite dar las presentaciones de pepete con un visor limpio, poder ir a fullscreen y volver y si quiero transformar las presentaciones en pdf simplemente saco screenshot de cada slide y luego los junto.&lt;br&gt;&lt;br&gt;mostrar un screenshot de webshot es lo mismo que mirar tu browser actual así que mucho sentido no tiene, eso si, hay dos ejemplos del resultado de guardar la pagina en el proyecto:&lt;br&gt;&lt;br&gt;&lt;a href="http://github.com/marianoguerra/webshot/raw/master/example-output.pdf"&gt;la pagina del proyecto en pdf&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://github.com/marianoguerra/webshot/raw/master/example-output.png"&gt;la pagina del proyecto en png&lt;/a&gt;&lt;br&gt;&lt;br&gt;una presentación sobre webshot en pepete (te recomiendo abrirla en webshot :P)&lt;br&gt;&lt;br&gt;&lt;a href="http://marianoguerra.github.com/pepete/show.html#webshot.json"&gt;http://marianoguerra.github.com/pepete/show.html#webshot.json&lt;/a&gt;&lt;br&gt;eso es todo&lt;/p&gt;</description><category>gtk</category><category>python</category><category>webkit</category><guid>http://marianoguerra.org/posts/201006webshots-aka-ya-tendria-que-empezar/</guid><pubDate>Thu, 03 Jun 2010 23:47:00 GMT</pubDate></item><item><title>Browser en pygtk con webkit en unas cuantas lineas de codigo</title><link>http://marianoguerra.org/posts/200911browser-en-pygtk-con-webkit-en-unas/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XkKIWh0VZYk/SwbjkcS9H8I/AAAAAAAAG08/woDSfYncdiU/s1600/browser.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_XkKIWh0VZYk/SwbjkcS9H8I/AAAAAAAAG08/woDSfYncdiU/s320/browser.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5406258617915350978"&gt;&lt;/a&gt;&lt;br&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;br&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;gtk&lt;/span&gt;&lt;br&gt;&lt;span class="c"&gt;# https://bugs.launchpad.net/bugs/480398&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gdk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;threads_init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;webkit&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Browser'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_default_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;480&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="n"&gt;scroll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ScrolledWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;scroll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_policy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POLICY_AUTOMATIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POLICY_AUTOMATIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;scroll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_shadow_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SHADOW_IN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WebView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;scroll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="n"&gt;vbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VBox&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'activate'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_on_url_changed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scroll&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'delete-event'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_on_url_changed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br&gt;&lt;span class="sd"&gt;'''called when the url changes'''&lt;/span&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'http://'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'https://'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'http://'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'www.google.com'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;</description><category>browser</category><category>gtk</category><category>python</category><category>webkit</category><guid>http://marianoguerra.org/posts/200911browser-en-pygtk-con-webkit-en-unas/</guid><pubDate>Fri, 20 Nov 2009 18:41:00 GMT</pubDate></item><item><title>problemas de pynotify con threads y gtk</title><link>http://marianoguerra.org/posts/200904problemas-de-pynotify-con-threads-y-gtk/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;agregue soporte para notificaciones en emesene 2, y de pronto la gui se empezó a congelar (la aplicación no porque se podía ver el log del protocolo que seguía pasando). Me di cuenta muy de suerte que el problema eran las notificaciones (había metido muchos otros cambios) ya que en debian no tenia python-notify instalado y andaba sin problemas y en ubuntu se congelaba, instale python-notify y se empezó a congelar de nuevo.&lt;br&gt;&lt;br&gt;comente las lineas y andaba, por lo que era eso.. busque en google y vi un parche que en lugar de:&lt;br&gt;&lt;br&gt;gtk.gdk.threads_init()&lt;br&gt;&lt;br&gt;hacia:&lt;br&gt;&lt;br&gt;gobject.threads_init()&lt;br&gt;gtk.gdk.threads_init()&lt;br&gt;&lt;br&gt;probe con eso y salio con fritas.&lt;br&gt;&lt;br&gt;este post es por si algún día les pasa algo parecido no tengan que pelear un buen rato para ver donde estaba el problema.&lt;/p&gt;</description><category>gobject</category><category>gtk</category><category>lock</category><category>pynotify</category><category>python</category><category>threads</category><guid>http://marianoguerra.org/posts/200904problemas-de-pynotify-con-threads-y-gtk/</guid><pubDate>Sat, 18 Apr 2009 08:38:00 GMT</pubDate></item><item><title>Codeando al pedo..</title><link>http://marianoguerra.org/posts/200711codeando-al-pedo/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;Debido a mi estadía en Alemania, me veo forzado a traducir un montón de palabras de alemán a español, para ello uso el servicio de esta pagina:&lt;br&gt;&lt;br&gt;www.myjmk.com&lt;br&gt;&lt;br&gt;pero como la interfaz es bastante bloated, decidí hacer un programita simple que saciara mis apetencias de traducción, en un rato, salio lo siguiente:&lt;br&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_XkKIWh0VZYk/RzivZ00La7I/AAAAAAAACNM/99ZDhzsiYkM/s1600-h/Pantallazo-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_XkKIWh0VZYk/RzivZ00La7I/AAAAAAAACNM/99ZDhzsiYkM/s400/Pantallazo-1.png" alt="" id="BLOGGER_PHOTO_ID_5132044633597766578" border="0"&gt;&lt;/a&gt;peleando un poco con los encodings, hice unos cuantos requests y de pronto, dejo de funcionar, no parecía haber ningún error, debugee lo que me estaba mandando el programa, y leo el siguiente lindo mensaje:&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="postshead"&gt;Access not allowed.&lt;/p&gt;                        &lt;p class="posts"&gt;Your access to the dictionary was rated as invalid. This could have various reasons. Possibly there is some other user sharing some ressources with you (e.g. a web proxy of your provider), scanning our dictionary systematically. We are very sorry for the inconvenience.&lt;/p&gt;&lt;/blockquote&gt;bue, tendrá que ser de otra forma :P&lt;br&gt;&lt;br&gt;pero bueno, aprendí algunas cositas&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;use por primera vez super(), enumerate() y zip() [1]&lt;br&gt;&lt;/li&gt;&lt;li&gt;conoci ' '.join()[2] en lugar de import string; string.join()[3]&lt;/li&gt;&lt;li&gt;conoci s.partition('sep')[4]&lt;/li&gt;&lt;/ul&gt;[1] http://docs.python.org/lib/built-in-funcs.html&lt;br&gt;[2] http://docs.python.org/lib/string-methods.html#l2h-250&lt;br&gt;[3] http://docs.python.org/lib/node42.html#l2h-379&lt;br&gt;[4] http://docs.python.org/lib/string-methods.html#l2h-254</description><category>gtk</category><category>myjmk</category><category>python</category><guid>http://marianoguerra.org/posts/200711codeando-al-pedo/</guid><pubDate>Mon, 12 Nov 2007 19:51:00 GMT</pubDate></item><item><title>snippet?</title><link>http://marianoguerra.org/posts/200702snippet/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;38 lineas de codigo..&lt;br&gt;para una minicompetencia&lt;br&gt;&lt;/p&gt;&lt;pre&gt;&lt;br&gt;import sys, gtk, time, random&lt;br&gt;l = c = m = 10&lt;br&gt;def onMinaPressed( button, x , y, campo ):&lt;br&gt;   if campo[ 'minas' ][ x ][ y ] == True:&lt;br&gt;       print 'Perdiste'&lt;br&gt;       sys.exit( 0 )&lt;br&gt;   else:&lt;br&gt;       button.set_label( str( campo[ 'numeros' ][ x ][ y ] ) )&lt;br&gt;&lt;br&gt;def getCampo( filas = 10, columnas = 10, minas = 10 ):&lt;br&gt;   l = [ [ 0 for x in range( columnas ) ] for y in range( filas ) ]&lt;br&gt;   m = [ [ False for x in range( columnas ) ] for y in range( filas ) ]&lt;br&gt;   for x in range( minas ):&lt;br&gt;       (x , y) = ( random.randint( 0, columnas - 1 ), random.randint( 0, filas - 1 ) )&lt;br&gt;       while m[ y ][ x ] != False:&lt;br&gt;           (x , y) = ( random.randint( 0, columnas - 1 ), random.randint( 0, filas - 1 ) )&lt;br&gt;       m[ y ][ x ] = True&lt;br&gt;       for i in range( -1,1 ):&lt;br&gt;           for j in range( -1,1 ):&lt;br&gt;               l[ x + i ][ y + j ] += 1&lt;br&gt;   return { 'numeros' : l, 'minas' : m } &lt;br&gt;&lt;br&gt;campo = getCampo( l, c, m )&lt;br&gt;w = gtk.Window()&lt;br&gt;w.set_title( 'HKmine' )&lt;br&gt;w.set_default_size( l * 15, c * 15 )&lt;br&gt;w.connect( 'delete-event', lambda *l: sys.exit( -1 ) )&lt;br&gt;v = gtk.VBox()&lt;br&gt;for y in range( l ):&lt;br&gt;   h = gtk.HBox()&lt;br&gt;   for x in range( c ):&lt;br&gt;       b = gtk.Button( '  ' )&lt;br&gt;       b.connect( 'clicked', onMinaPressed, x, y, campo )&lt;br&gt;       h.pack_start( b )&lt;br&gt;   v.pack_start( h )&lt;br&gt;w.add( v )&lt;br&gt;w.show_all()&lt;br&gt;gtk.main()&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i123.photobucket.com/albums/o290/tehmostro/Pantallazo-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 152px; height: 240px;" src="http://i123.photobucket.com/albums/o290/tehmostro/Pantallazo-1.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;si, ahora vienen todos esos comentarios del tipo sos un **** ...</description><category>buto</category><category>gtk</category><category>python</category><guid>http://marianoguerra.org/posts/200702snippet/</guid><pubDate>Thu, 22 Feb 2007 16:40:00 GMT</pubDate></item></channel></rss>