<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8474947454225853305</id><updated>2012-01-20T10:05:25.130+01:00</updated><category term='tanenbaum'/><category term='writexml'/><category term='el viaje del navegante'/><category term='templates'/><category term='createTextNode'/><category term='ejemplo'/><category term='pdfgen'/><category term='jupp'/><category term='ironpython'/><category term='configuración'/><category term='software libre'/><category term='pymedia'/><category term='hasAttribute'/><category term='encoding'/><category term='kurose'/><category term='C'/><category term='softonic'/><category term='pydeadobject'/><category term='objeto'/><category term='monedas'/><category term='datawindow'/><category term='renderPDF'/><category term='makepy'/><category term='algoritmia'/><category term='calidad'/><category term='firebird'/><category term='sybase'/><category term='platypus'/><category term='pycon'/><category term='paso 0'/><category term='pyLorca'/><category term='mySQLdb'/><category term='pythoniana'/><category term='sqlserver'/><category term='wxGlade'/><category term='flowable'/><category term='crear documentos PDF'/><category term='mantenimiento'/><category term='executemany'/><category term='pymetar en español'/><category term='conceptos básicos'/><category term='.net'/><category term='tokenize'/><category term='interfaz gráfica'/><category term='prototipo'/><category term='herencia'/><category term='xml.dom'/><category term='python y pymetar'/><category term='librería de clases'/><category term='weather'/><category term='xml'/><category term='paradoja python'/><category term='Trabajo'/><category term='ensamblado'/><category term='documentación software libre'/><category term='mysql'/><category term='java'/><category term='pymetar'/><category term='ogg'/><category term='sharpdevelop'/><category term='polimorfismo'/><category term='ágil'/><category term='property'/><category term='graphics'/><category term='crear DOM'/><category term='bases de datos'/><category term='dosbox'/><category term='ejercicios'/><category term='platypus story'/><category term='event handler'/><category term='gui'/><category term='vipera'/><category term='pdf'/><category term='minidom'/><category term='visual studio'/><category term='pyrox'/><category term='mvc'/><category term='abstracción'/><category term='umu'/><category term='clasificación'/><category term='editor'/><category term='dinámico'/><category term='ironpython studio'/><category term='foldpanelbar'/><category term='Panel'/><category term='html'/><category term='AUI_Notebook'/><category term='persistencia'/><category term='scroll'/><category term='sitecustomize.py'/><category term='folosofía'/><category term='herencia múltiple'/><category term='wx.CollapsiblePane'/><category term='vista'/><category term='ide'/><category term='base de datos'/><category term='universidad de murcia'/><category term='juegos'/><category term='Crystal Reports'/><category term='sonido'/><category term='dmoz'/><category term='poo'/><category term='pyodbc'/><category term='dom'/><category term='joe'/><category term='fetchmany'/><category term='encapsulación'/><category term='cliente'/><category term='clase string'/><category term='setdefaultencoding'/><category term='insert_id'/><category term='getAttribute'/><category term='murcia'/><category term='pyragua'/><category term='stringIO'/><category term='fetchone'/><category term='social'/><category term='os.path.realpath'/><category term='meteorológico'/><category term='lopd'/><category term='documento'/><category term='evento'/><category term='codecs'/><category term='probe'/><category term='dennis'/><category term='reflector'/><category term='política'/><category term='pyYAML'/><category term='inicialización'/><category term='firebird con python'/><category term='frases célebres'/><category term='doctemplate'/><category term='python'/><category term='stallings'/><category term='KInterbasDB'/><category term='traspasar bases de datos'/><category term='bibliografía'/><category term='windows'/><category term='canvas'/><category term='multiplataforma'/><category term='metodología'/><category term='IDLE'/><category term='redes'/><category term='wxFormBuilder'/><category term='manual'/><category term='linux'/><category term='ordenación'/><category term='conferencia'/><category term='python.ide'/><category term='python en español'/><category term='drawing'/><category term='quicksort'/><category term='iso-8859-1'/><category term='pagetemplate'/><category term='connect'/><category term='profilePython'/><category term='variables primitivas'/><category term='execute'/><category term='cPickle'/><category term='party'/><category term='2010'/><category term='project.properties'/><category term='knuth'/><category term='empresa'/><category term='COM'/><category term='recursos documentales'/><category term='%s'/><category term='createDocument'/><category term='tiempo. clima'/><category term='modelo-vista-controlador'/><category term='OGL'/><category term='netbeans'/><category term='wxPython'/><category term='sizer'/><category term='getDOMImplementation'/><category term='reportlab'/><category term='lotería'/><category term='sql'/><category term='CustomControl'/><category term='clr'/><category term='diagrama'/><category term='atributo'/><category term='microsoft'/><category term='clase'/><category term='appendChild'/><category term='pygame'/><category term='ritchie'/><category term='frame'/><category term='programar'/><category term='profile'/><category term='wx'/><title type='text'>El viaje del navegante</title><subtitle type='html'>Blog de programación Python en español.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default?start-index=101&amp;max-results=100'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>111</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4540596296476777315</id><published>2012-01-13T11:53:00.000+01:00</published><updated>2012-01-13T11:53:35.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='probe'/><category scheme='http://www.blogger.com/atom/ns#' term='diagrama'/><title type='text'>Método de estimación Probe</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kHN0d_eC7QQ/TxAMq0X3OnI/AAAAAAAABUc/UsHrKsyGs2w/s1600/Metodo_estimacion_PROBE.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-kHN0d_eC7QQ/TxAMq0X3OnI/AAAAAAAABUc/UsHrKsyGs2w/s640/Metodo_estimacion_PROBE.bmp" width="385" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4540596296476777315?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4540596296476777315/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2012/01/metodo-de-estimacion-probe.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4540596296476777315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4540596296476777315'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2012/01/metodo-de-estimacion-probe.html' title='Método de estimación Probe'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-kHN0d_eC7QQ/TxAMq0X3OnI/AAAAAAAABUc/UsHrKsyGs2w/s72-c/Metodo_estimacion_PROBE.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-5479181208941925191</id><published>2011-12-28T19:24:00.000+01:00</published><updated>2011-12-28T19:24:14.581+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ágil'/><category scheme='http://www.blogger.com/atom/ns#' term='metodología'/><title type='text'>Metodología Ágil</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-G9Hms0nJmoY/TvtesbCYNzI/AAAAAAAABUQ/c_ke7gH0hLE/s1600/METODOLOG%25C3%258DA_AGIL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="486" src="http://1.bp.blogspot.com/-G9Hms0nJmoY/TvtesbCYNzI/AAAAAAAABUQ/c_ke7gH0hLE/s640/METODOLOG%25C3%258DA_AGIL.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-5479181208941925191?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/5479181208941925191/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/metodologia-agil.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5479181208941925191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5479181208941925191'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/metodologia-agil.html' title='Metodología Ágil'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-G9Hms0nJmoY/TvtesbCYNzI/AAAAAAAABUQ/c_ke7gH0hLE/s72-c/METODOLOG%25C3%258DA_AGIL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8379611479002508387</id><published>2011-12-28T19:22:00.000+01:00</published><updated>2011-12-28T19:22:23.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuración'/><title type='text'>Gestión de configuraciones de software</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-guzFLza_XGw/TvteQXwiX6I/AAAAAAAABUE/mNlJUaEWuQQ/s1600/GESTION_CONFIGURACIONES_SOFTWARE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://3.bp.blogspot.com/-guzFLza_XGw/TvteQXwiX6I/AAAAAAAABUE/mNlJUaEWuQQ/s640/GESTION_CONFIGURACIONES_SOFTWARE.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8379611479002508387?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8379611479002508387/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/gestion-de-configuraciones-de-software.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8379611479002508387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8379611479002508387'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/gestion-de-configuraciones-de-software.html' title='Gestión de configuraciones de software'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-guzFLza_XGw/TvteQXwiX6I/AAAAAAAABUE/mNlJUaEWuQQ/s72-c/GESTION_CONFIGURACIONES_SOFTWARE.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8930606965510361403</id><published>2011-12-28T19:19:00.000+01:00</published><updated>2011-12-28T19:19:29.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calidad'/><title type='text'>Calidad del software</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_q8Fv0_dURY/TvtdRrwle_I/AAAAAAAABT4/giLrTUnVHlI/s1600/CALIDAD_DEL_SOFTWARE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="631" src="http://2.bp.blogspot.com/-_q8Fv0_dURY/TvtdRrwle_I/AAAAAAAABT4/giLrTUnVHlI/s640/CALIDAD_DEL_SOFTWARE.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8930606965510361403?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8930606965510361403/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/calidad-del-software.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8930606965510361403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8930606965510361403'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/calidad-del-software.html' title='Calidad del software'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-_q8Fv0_dURY/TvtdRrwle_I/AAAAAAAABT4/giLrTUnVHlI/s72-c/CALIDAD_DEL_SOFTWARE.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-6168057538362993203</id><published>2011-12-03T17:31:00.001+01:00</published><updated>2011-12-11T21:11:32.078+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vipera'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>vipera 1.0.0</title><content type='html'>Hola. Acabo de subir &lt;b&gt;vipera 1.0.0&lt;/b&gt; en:&amp;nbsp;&lt;a href="http://code.google.com/p/vipera/"&gt;http://code.google.com/p/vipera/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/%20https://www.facebook.com/photo.php?v=2040359947038"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-FvQclQSORk0/TtpOeNA-WUI/AAAAAAAABTg/28W5EKVLCZM/s1600/logo_vipera_azul.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;vipera&lt;/b&gt; está bajo licencia &lt;b&gt;GPL 3&lt;/b&gt;, por lo que se puede modificar, distribuir y hacer lo que se considere siempre bajo los términos de la &lt;b&gt;General Public License&lt;/b&gt;, versión 3.&lt;br /&gt;&lt;br /&gt;No he creado instaladores, puesto que no me ha dado tiempo, y como estoy en fase de pruebas y depuración de cosas, pues no me ha parecido conveniente.&lt;br /&gt;&lt;br /&gt;Para hacer funcionar &lt;b&gt;vipera&lt;/b&gt; únicamente hay que hacer:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;python vipera.py&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Si diera algún problema de fichero de configuración.... (perdón):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;python vipera.py -r&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Si encontráis alguna cosa rara, algún mal funcionamiento os agradecería eternamente que me lo comentaseis.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;vipera&lt;/b&gt; es un proyecto, que ahora que está terminado, veo que puede mejorarse en muchas cosas, pero la idea era lo primero, así que a partir de dicha idea se puede ir a otros puertos, con otras tecnologías, como &lt;b&gt;OpenGL&lt;/b&gt; en vez de &lt;b&gt;OGL&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #990000;"&gt;&lt;b&gt;NOTA: Hay un vídeo demostrativo de su funcionamiento en:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.facebook.com/photo.php?v=2040359947038" target="_blank"&gt;https://www.facebook.com/&lt;wbr&gt;&lt;/wbr&gt;photo.php?v=2040359947038&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;Un saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-6168057538362993203?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/6168057538362993203/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/vipera-100.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/6168057538362993203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/6168057538362993203'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/12/vipera-100.html' title='vipera 1.0.0'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-FvQclQSORk0/TtpOeNA-WUI/AAAAAAAABTg/28W5EKVLCZM/s72-c/logo_vipera_azul.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-853002688437107278</id><published>2011-11-18T14:33:00.002+01:00</published><updated>2011-11-18T14:39:03.300+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pydeadobject'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>wxPython: cómo controlar los PyDeadObject</title><content type='html'>Hola. En este artículo vamos a ver una manera muy fácil de poder controlar los errores producidos en &lt;b&gt;wxPython&lt;/b&gt; cuando se intenta acceder a widgets que han sido destruidos. Y vamos a verlo con el siguiente ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #660000;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;import wx&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #bf9000;"&gt;&lt;span style="color: black;"&gt;class&lt;/span&gt;&lt;b&gt; mi_frame&lt;/b&gt;&lt;/span&gt;(wx.Frame):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self, parent):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.Frame.__init__(self, parent)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetTitle("Ejemplo de PyDeadObject")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: #274e13;"&gt; # 2 botones.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1 = wx.Button(self, -1, u"Botón 1")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton2 = wx.Button(self, -1, u"Botón 2")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton1, 0, wx.ALL, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton2, 0, wx.ALL, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetSizer(sizer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b style="color: #274e13;"&gt;# Binding.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.Bind(wx.EVT_BUTTON,&lt;b&gt;&lt;span style="color: #0b5394;"&gt; self.OnBoton1&lt;/span&gt;&lt;/b&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton2.Bind(wx.EVT_BUTTON,&lt;span style="color: #0b5394;"&gt; &lt;b&gt;self.OnBoton2&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0b5394;"&gt; &lt;b&gt;def OnBoton1(self, event):&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.SetLabel("Hola Python")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: #0b5394;"&gt; def OnBoton2(self, event):&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.SetLabel("Hola wxPython")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;app = wx.PySimpleApp()&lt;br /&gt;f =&lt;b&gt; &lt;span style="color: #bf9000;"&gt;mi_frame&lt;/span&gt;&lt;/b&gt;(None)&lt;br /&gt;f.Show()&lt;br /&gt;app.MainLoop()&lt;br /&gt;&lt;br /&gt;Como se puede observar este script es una ventana que contiene dos botones. Al hacer click en cada uno de los botones se va cambiando el Label del primer botón. Esto es:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uFZOUFNRgEc/TsZX2wIv24I/AAAAAAAABSs/7s3zy2K8TFE/s1600/pydeadobject1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-uFZOUFNRgEc/TsZX2wIv24I/AAAAAAAABSs/7s3zy2K8TFE/s320/pydeadobject1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hacemos click en el botón de la izquierda:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7mLDog6_EvI/TsZX3inVqII/AAAAAAAABS0/8r3_zN7C3LQ/s1600/pydeadobject2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-7mLDog6_EvI/TsZX3inVqII/AAAAAAAABS0/8r3_zN7C3LQ/s320/pydeadobject2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hacemos click en el botón de la derecha:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qvf5jm6Zux8/TsZX4CxJJgI/AAAAAAAABS4/Lbil53jEKSI/s1600/pydeadobject3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-qvf5jm6Zux8/TsZX4CxJJgI/AAAAAAAABS4/Lbil53jEKSI/s320/pydeadobject3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ahora vamos a hacer una pequeña modificación en el método &lt;b style="color: #0b5394;"&gt;OnBoton2&lt;/b&gt;: vamos a incluir una instrucción para que cuando se haga click en el botón 2 se elimine el botón 1:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0b5394;"&gt; &lt;b&gt;def OnBoton2(self, event):&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.SetLabel("Hola wxPython")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: red;"&gt;self.boton1.Destroy()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si volvemos a hacer la misma operativa de arriba, cuando hagamos click en el boton 2 al intentar hacer el &lt;b&gt;SetLabel&lt;/b&gt; nos dará un error &lt;b&gt;PyDeadObject&lt;/b&gt;, ya que estamos intentando acceder a un widget que ya ha sido eliminado. Es decir:&lt;br /&gt;&lt;br /&gt;Hacemos un primer click en el botón derecho:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SdlcJ3HnP3U/TsZaSzyqGrI/AAAAAAAABTE/2az2xnNOJSI/s1600/pydeadobject4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-SdlcJ3HnP3U/TsZaSzyqGrI/AAAAAAAABTE/2az2xnNOJSI/s320/pydeadobject4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y al hacer un segundo click sobre el botón derecho nos da el siguiente error: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;wx._core.PyDeadObjectError: The C++ part of the Button object has been deleted, attribute access no longer allowed.&lt;/b&gt;&lt;br /&gt;&lt;span style="color: #0b5394;"&gt;File "c:\Users\Angel Luis\Desktop\ej_pydeadobject.py", line 30, in &lt;module&gt;&lt;/module&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0b5394;"&gt;&amp;nbsp; app.MainLoop()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0b5394;"&gt;File "c:\Python26\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 8010, in MainLoop&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0b5394;"&gt;&amp;nbsp; wx.PyApp.MainLoop(self)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0b5394;"&gt;File "c:\Python26\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 7306, in MainLoop&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0b5394;"&gt;&amp;nbsp; return _core_.PyApp_MainLoop(*args, **kwargs)&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: red;"&gt;File "c:\Users\Angel Luis\Desktop\ej_pydeadobject.py", line 24, in OnBoton2&lt;/span&gt;&lt;br style="color: red;" /&gt;   &lt;span style="color: red;"&gt;&amp;nbsp; self.boton1.SetLabel("Hola wxPython")&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;File "c:\Python26\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14610, in __getattr__&lt;br /&gt;&amp;nbsp; raise PyDeadObjectError(self.attrStr % self._name)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Que corresponde con la línea &lt;b&gt;wx _core.py:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RETdmAHaNKo/TsZaTqZYR2I/AAAAAAAABTM/Ym1c3JNQ1ts/s1600/pydeadobject5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://4.bp.blogspot.com/-RETdmAHaNKo/TsZaTqZYR2I/AAAAAAAABTM/Ym1c3JNQ1ts/s640/pydeadobject5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #990000;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;¿Solución?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;En ciertas áreas de nuestro código&lt;b&gt; wxPython&lt;/b&gt; que sepamos que son susceptibles de ser eliminadas y después con posibilidad de ser referenciadas de nuevo (por un proceso, por un hilo o por cualquier otra cosa), podemos evaluar primero el widget para ver si realmente existe y luego realizar las operaciones pertinentes. En nuestro ejemplo vamos a cambiar de nuevo el método &lt;b style="color: #0b5394;"&gt;OnBoton2&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #660000;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;import wx&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #bf9000;"&gt;&lt;span style="color: black;"&gt;class&lt;/span&gt;&lt;b&gt; mi_frame&lt;/b&gt;&lt;/span&gt;(wx.Frame):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self, parent):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.Frame.__init__(self, parent)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetTitle("Ejemplo de PyDeadObject")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: #274e13;"&gt; # 2 botones.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1 = wx.Button(self, -1, u"Botón 1")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton2 = wx.Button(self, -1, u"Botón 2")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton1, 0, wx.ALL, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton2, 0, wx.ALL, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetSizer(sizer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b style="color: #274e13;"&gt;# Binding.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.Bind(wx.EVT_BUTTON,&lt;b&gt;&lt;span style="color: #0b5394;"&gt; self.OnBoton1&lt;/span&gt;&lt;/b&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton2.Bind(wx.EVT_BUTTON,&lt;span style="color: #0b5394;"&gt; &lt;b&gt;self.OnBoton2&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0b5394;"&gt; &lt;b&gt;def OnBoton1(self, event):&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.SetLabel("Hola Python")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: #0b5394;"&gt; def OnBoton2(self, event):&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;span style="color: magenta;"&gt; if not self.boton1:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.MessageBox(u"El botón se destruyó")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: magenta;"&gt;else:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton1.SetLabel("Hola wxPython")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: red;"&gt;self.boton1.Destroy()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;app = wx.PySimpleApp()&lt;br /&gt;f =&lt;b&gt; &lt;span style="color: #bf9000;"&gt;mi_frame&lt;/span&gt;&lt;/b&gt;(None)&lt;br /&gt;f.Show()&lt;br /&gt;app.MainLoop()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #660000; font-size: large;"&gt;&lt;b&gt;¿Por qué?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pues porque cuando un &lt;b&gt;widget&lt;/b&gt; se elimina pasa a ser un &lt;b&gt;_wxPyDeadObject&lt;/b&gt; el cual gana un método &lt;b&gt;__nonzero__&lt;/b&gt; que siempre devuelve&lt;b&gt; False&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Si volvemos a ejecutar nuestro nuevo script y hacemos dos veces click en el botón de la derecha tendremos el siguiente resultado:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QU2iGlSXbZo/TsZeT0XjhzI/AAAAAAAABTU/4Pmj0FZzmw0/s1600/pydeadobject6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://4.bp.blogspot.com/-QU2iGlSXbZo/TsZeT0XjhzI/AAAAAAAABTU/4Pmj0FZzmw0/s320/pydeadobject6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Espero que este artículo os sirva para escribir aplicaciones &lt;b&gt;wxPython&lt;/b&gt; más robustas.&lt;br /&gt;&lt;br /&gt;Un saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-853002688437107278?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/853002688437107278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/11/wxpython-como-controlar-los.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/853002688437107278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/853002688437107278'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/11/wxpython-como-controlar-los.html' title='wxPython: cómo controlar los PyDeadObject'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uFZOUFNRgEc/TsZX2wIv24I/AAAAAAAABSs/7s3zy2K8TFE/s72-c/pydeadobject1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-5090221785202804657</id><published>2011-11-04T09:57:00.001+01:00</published><updated>2011-11-04T09:57:53.775+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redes'/><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title type='text'>Redes sociales: ¿Dónde debes enviar tu estado?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZvAFuqZ9WSg/TrOoZFmuh_I/AAAAAAAABSc/AJwsmH2GeUk/s1600/estado_redes_sociales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://1.bp.blogspot.com/-ZvAFuqZ9WSg/TrOoZFmuh_I/AAAAAAAABSc/AJwsmH2GeUk/s640/estado_redes_sociales.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #990000;"&gt;&lt;b&gt;&lt;i&gt;Chuleta para recordar donde hay que enviar nuestro estado...&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;i style="color: #990000;"&gt;...y es que es mejor prevenir que curar...&lt;/i&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-5090221785202804657?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/5090221785202804657/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/11/redes-sociales-donde-debes-enviar-tu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5090221785202804657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5090221785202804657'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/11/redes-sociales-donde-debes-enviar-tu.html' title='Redes sociales: ¿Dónde debes enviar tu estado?'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZvAFuqZ9WSg/TrOoZFmuh_I/AAAAAAAABSc/AJwsmH2GeUk/s72-c/estado_redes_sociales.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8419240659382357496</id><published>2011-10-27T12:09:00.002+02:00</published><updated>2011-10-27T17:55:01.242+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vipera'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>vipera tester 1.0.0</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qUVh34M3zEY/Tql-ry2t1KI/AAAAAAAABSM/qeYzfbzW480/s1600/logo+vipera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://4.bp.blogspot.com/-qUVh34M3zEY/Tql-ry2t1KI/AAAAAAAABSM/qeYzfbzW480/s320/logo+vipera.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hola. Estas son las grabaciones de &lt;b style="color: #990000;"&gt;vipera&lt;/b&gt;, &lt;u&gt;&lt;i&gt;&lt;b&gt;un diseñador de aplicaciones para Python&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;.  Este programa será mi proyecto fin de carrera (o de grado como se llama  ahora). En este primer vídeo hago una simulación muy sencilla de  creación de clases de manera gráfica, y como se genera el código Python  correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="https://www.facebook.com/video/video.php?v=1889051804429"&gt;https://www.facebook.com/video/video.php?v=1889051804429&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En los siguientes links se muestran como hacer prototipos de funciones:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.facebook.com/video/video.php?v=1889100005634"&gt;https://www.facebook.com/video/video.php?v=1889100005634&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.facebook.com/video/video.php?v=1889147406819"&gt;https://www.facebook.com/video/video.php?v=1889147406819&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Estos vídeos los he creado con &lt;b&gt;recordMyDesktop&lt;/b&gt;. Perdón por no tener sonido el primero de ellos, estaba en fase de pruebas...&lt;br /&gt;&lt;br /&gt;Por último decir que vipera puede crear módulos con clases, funciones, registros (emulados con funciones o clases), constantes y código de ejecución para pruebas de módulo.&lt;br /&gt;&lt;br /&gt;Además incluye un diseñador de packages visual estilo árbol, un generador de documentación de proyecto y un sistema de generación de licencias. Además tiene un módulo de ingeniería inversa, en donde a partir de código Python se muestran las clases y sus relaciones.&lt;br /&gt;&lt;br /&gt;Se puede imprimir el código generado, así como los diagramas diseñados. En próximos vídeos más.&lt;br /&gt;&lt;br /&gt;Espero publicar este programa bajo las condiciones de &lt;b&gt;GPL 3&lt;/b&gt;, a la espera que me de permiso la &lt;a href="http://www.uem.es/"&gt;Universidad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Un saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8419240659382357496?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8419240659382357496/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/10/esta-es-una-prueba.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8419240659382357496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8419240659382357496'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/10/esta-es-una-prueba.html' title='vipera tester 1.0.0'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-qUVh34M3zEY/Tql-ry2t1KI/AAAAAAAABSM/qeYzfbzW480/s72-c/logo+vipera.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1826725025264458818</id><published>2011-10-16T15:38:00.001+02:00</published><updated>2011-10-16T15:39:57.117+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dennis'/><category scheme='http://www.blogger.com/atom/ns#' term='ritchie'/><title type='text'>Dennis Ritchie</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Dennis Ritchie&lt;/b&gt; murió el pasado Miércoles 12 de Octubre. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-XvGg3kj7jhw/TprckWUIiyI/AAAAAAAABSA/anZOR9GpMxk/s1600/dennis_ritchie.png" /&gt;&lt;a href="http://es.wikipedia.org/wiki/Dennis_Ritchie"&gt;http://es.wikipedia.org/wiki/Dennis_Ritchie&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una de "&lt;i&gt;sus pocas contribuciones&lt;/i&gt;" fue (junto con &lt;b&gt;Ken Thompson&lt;/b&gt;) la creación del lenguaje de programación C, base de la mayoría de las tecnologías de las que ahora disfrutamos. Será por ello que no sale en televisión.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Descanse en paz.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1826725025264458818?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1826725025264458818/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/10/dennis-ritchie.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1826725025264458818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1826725025264458818'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/10/dennis-ritchie.html' title='Dennis Ritchie'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-XvGg3kj7jhw/TprckWUIiyI/AAAAAAAABSA/anZOR9GpMxk/s72-c/dennis_ritchie.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-917983714429429490</id><published>2011-06-13T13:33:00.000+02:00</published><updated>2011-06-13T13:33:52.669+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wx'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><category scheme='http://www.blogger.com/atom/ns#' term='wxFormBuilder'/><title type='text'>Taller tutorial de wxFormBuilder, en español</title><content type='html'>Hola. En este post os presento un material sobre &lt;b&gt;wxFormBuilder&lt;/b&gt;, el diseñador de interfaces gráficas para &lt;b&gt;wxPython&lt;/b&gt;, que se utilizará en el &lt;i&gt;taller Caldum&lt;/i&gt; de esta tarde 13 de Junio.&lt;br /&gt;&lt;br /&gt;El material lo podéis bajar, como siempre, del repositorio de este blog:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/documentacion"&gt;https://sites.google.com/site/elviajedelnavegante/documentacion &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Es un &lt;i&gt;zip&lt;/i&gt;, &lt;b&gt;Taller_wxFB.zip&lt;/b&gt;, que contiene un &lt;b&gt;PDF&lt;/b&gt; con la explicación/teoría/presentación del taller, así como carpetas con proyectos &lt;b&gt;wxFB&lt;/b&gt; hechos. De la misma forma se incluyen ficheros &lt;b&gt;Python&lt;/b&gt; que utilizan el código generado por &lt;b&gt;wxFB&lt;/b&gt; para crear las interfaces.&lt;br /&gt;&lt;br /&gt;Espero os sirva este material para vuestros intereses.&lt;br /&gt;&lt;br /&gt;Un cordial saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-917983714429429490?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/917983714429429490/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/06/taller-tutorial-de-wxformbuilder-en.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/917983714429429490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/917983714429429490'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/06/taller-tutorial-de-wxformbuilder-en.html' title='Taller tutorial de wxFormBuilder, en español'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4708145609667434852</id><published>2011-06-04T14:25:00.000+02:00</published><updated>2011-06-04T14:25:58.278+02:00</updated><title type='text'>Taller Caldum: wxFormBuilder (wxPython)</title><content type='html'>Hola. Escribo este post para comunicar que se ha retrasado el taller &lt;a href="http://diascaldum.um.es/"&gt;CALDUM de wxFormBuilder&lt;/a&gt;, y se impartirá el día 13 de Junio (Lunes), de 16:00 a 20:00 horas.&lt;br /&gt;&lt;br /&gt;El taller se podrá seguir online por &lt;a href="http://videoconferencia.um.es/caldum"&gt;videoconferencia&lt;/a&gt;. Más información en la página de CALDUM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object data="http://um.sym.posium.com/event_detail/simple/503" style="height: 400px; width: 600px;" type="text/html"&gt;&lt;a href="http://um.sym.posium.com/event_detail/simple/503"&gt;Enlace&lt;/a&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4708145609667434852?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4708145609667434852/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/06/taller-caldum-wxformbuilder-wxpython.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4708145609667434852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4708145609667434852'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/06/taller-caldum-wxformbuilder-wxpython.html' title='Taller Caldum: wxFormBuilder (wxPython)'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1780712099183565604</id><published>2011-05-22T12:39:00.001+02:00</published><updated>2011-06-04T14:19:49.479+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='universidad de murcia'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><category scheme='http://www.blogger.com/atom/ns#' term='wxFormBuilder'/><title type='text'>Taller de wxFormbuilder en la Universidad de Murcia</title><content type='html'>Hola. El día &lt;s&gt;10 de Junio&lt;/s&gt; 13 de Junio (Lunes), de 16:00 a 20:00 impartiré un taller &lt;b&gt;&lt;a href="http://diascaldum.um.es/"&gt;CALDUM&lt;/a&gt;&lt;/b&gt; sobre&lt;b&gt; &lt;a href="http://wxformbuilder.org/"&gt;wxFormBuilder&lt;/a&gt;&lt;/b&gt; en la &lt;a href="http://www.um.es/"&gt;&lt;b&gt;Universidad de Murcia&lt;/b&gt;&lt;/a&gt;, &lt;br /&gt;&lt;br /&gt;Es necesario saber&lt;b&gt; Python&lt;/b&gt; así como tener clara la &lt;i&gt;programación orientada a objetos&lt;/i&gt;, ya que veremos, no solamente el diseño de pantallas en &lt;b&gt;wxFormBuilder&lt;/b&gt;, también el código que genera, para modificarlo&amp;nbsp; mediante herencia, en lo que se refiere a manejadores de eventos.&lt;br /&gt;&lt;br /&gt;En este taller se verá fundamentalmente:&lt;br /&gt;&lt;br /&gt;0) Generación de proyectos.&lt;br /&gt;1) Contenedores de alto nivel: Frames, Paneles&lt;br /&gt;2) Sistemas de menús.&lt;br /&gt;3) Componentes:&lt;br /&gt;&amp;nbsp; 3.1) AUI_Notebook&lt;br /&gt;&amp;nbsp; 3.2) Controles de texto y etiquetas.&lt;br /&gt;&amp;nbsp; 3.3) Etc...&lt;br /&gt;4) Posicionamiento de widgets mediante Sizers (BoxSizer y FlexGridSizer).&lt;br /&gt;5) Herencia y override de métodos del código generado.&lt;br /&gt;6) Aplicaciones FrontEnd en wxPython.&lt;br /&gt;7) Bibliografía.&lt;br /&gt;&lt;br /&gt;De lo que se trata en este taller es que el asistente tenga una idea clara de las posibilidades de &lt;b&gt;wxFormBuilder&lt;/b&gt; como diseñador de interfaces gráficas basado en &lt;b&gt;wxPython&lt;/b&gt;. El taller es eminentemente práctico, en donde se abarcarán la mayoría de conceptos de&lt;b&gt; wxPython&lt;/b&gt;, a saber, &lt;i&gt;widgets&lt;/i&gt; principales, &lt;i&gt;binding&lt;/i&gt;, &lt;i&gt;manejadores de eventos&lt;/i&gt; y &lt;i&gt;herencia&lt;/i&gt; y&lt;i&gt; override&lt;/i&gt; de métodos.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1780712099183565604?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1780712099183565604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/05/taller-de-wxformbuilder-en-la.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1780712099183565604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1780712099183565604'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/05/taller-de-wxformbuilder-en-la.html' title='Taller de wxFormbuilder en la Universidad de Murcia'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-704403081005372294</id><published>2011-05-19T23:03:00.001+02:00</published><updated>2011-05-19T23:08:20.760+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='AUI_Notebook'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>wxPython: Obtener datos de las hojas de un AUI_Notebook</title><content type='html'>Hola. En este post vamos a ver el componente de &lt;b&gt;wxPython AUI Notebook&lt;/b&gt;, y en especial su instanciación, creación de hojas y forma de recorrerlas para obtener la información que pudiera haber sido introducida por el usuario.&lt;br /&gt;&lt;br /&gt;Hay un ejemplo muy completo en la &lt;b&gt;Demo de wxPython&lt;/b&gt;. Aquí se verá lo mismo, más simplificado y con el plus del recorrido de las hojas del &lt;b&gt;AUI Notebook&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;El código fuente de esta aplicación se puede encontrar en el repositorio de este blog, en:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/"&gt;https://sites.google.com/site/elviajedelnavegante/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para poder entender bien como funciona un &lt;b&gt;AUI_Notebook&lt;/b&gt; es necesario realizar un ejemplo, ya que es la mejor manera posible. De lo que se trata es de crear un módulo (fichero) que contendrá 2 clases. Una de ellas será el diseño de una hoja (que hereda de &lt;b&gt;wx.Panel&lt;/b&gt;), y la segunda clase será un frame que heredará de &lt;b&gt;wx.Frame&lt;/b&gt;. Cada hoja del &lt;b&gt;AUI_Notebook&lt;/b&gt; será una instanciación de la clase hoja.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Comenzamos...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Lo primero de todo es importar los módulos necesarios:&lt;br /&gt;&lt;br /&gt;import wx&lt;br /&gt;import wx.aui&lt;br /&gt;&lt;br /&gt;A continuación diseñamos la clase que representará cada hoja de nuestro &lt;b&gt;AUI_Notebook&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;class &lt;b&gt;&lt;span style="color: orange;"&gt;hoja_notebook&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: #38761d;"&gt;wx.Panel&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self, parent, &lt;span style="color: magenta;"&gt;nombre_hoja&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Constructor.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.Panel.__init__(self, parent)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Sizer.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Etiqueta.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.c0 = wx.StaticText(self, -1, &lt;span style="color: magenta;"&gt;nombre_hoja&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Cajas de texto.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.c1 = wx.TextCtrl(self, -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.c2 = wx.TextCtrl(self, -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Posicionamos las cajas de texto y la etiqueta en el sizer.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.c0, 0, wx.EXPAND|wx.ALL,5)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.c1, 0, wx.EXPAND|wx.ALL,5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.c2, 0, wx.EXPAND|wx.ALL,5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Añadimos el sizer al frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetSizer(sizer)&lt;br /&gt;&lt;br /&gt;Esta clase hereda de un &lt;b&gt;wx.Panel&lt;/b&gt;, por lo que es un panel. Vemos que dentro tiene un &lt;i&gt;sizer&lt;/i&gt; vertical que posiciona una etiqueta y dos cajas de texto. En la instanciación de la clase pasamos el texto que se presentará en la etiqueta.&lt;br /&gt;&lt;br /&gt;Bien, ahora crearemos el diseño de la clase frame que contendrá el &lt;b&gt;AUI_Notebook&lt;/b&gt; y que contendrá hojas a través de la instanciación de la clase anterior.&lt;br /&gt;&lt;br /&gt;class &lt;b style="color: #45818e;"&gt;frame_principal&lt;/b&gt;(&lt;span style="color: #38761d;"&gt;wx.Frame&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self, parent):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Constructor.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.Frame.__init__(self, parent, title = "Trabajando con el AUI NoteBook")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Sizer.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Botón para obtener datos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton = wx.Button(self, -1, "Devolver datos")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Incluimos el botón en el sizer.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton, 0, wx.EXPAND|wx.ALL, 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Panel de NoteBook.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.panel = &lt;b&gt;&lt;span style="color: blue;"&gt;wx.aui.AuiNotebook&lt;/span&gt;&lt;/b&gt;(self, -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Hojas.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hoja1 = &lt;b&gt;&lt;span style="color: orange;"&gt;hoja_notebook&lt;/span&gt;&lt;/b&gt;(self.panel, "Primera hoja")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hoja2 = &lt;b&gt;&lt;span style="color: orange;"&gt;hoja_notebook&lt;/span&gt;&lt;/b&gt;(self.panel, "Segunda hoja")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hoja3 = &lt;b style="color: orange;"&gt;hoja_notebook&lt;/b&gt;(self.panel, "Tercera hoja")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Añadimos las hojas al NoteBook.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.panel.AddPage(hoja1, "Hoja 0")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.panel.AddPage(hoja2, "Hoja 1")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.panel.AddPage(hoja3, "Hoja 2")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #990000;"&gt; # Incluimos el panel en el sizer.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.panel, 1, wx.EXPAND|wx.ALL, 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Y añadimos el sizer al frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetSizer(sizer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Binding.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton.Bind(wx.EVT_BUTTON, self.OnClickBoton)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Manejador de eventos.&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def OnClickBoton(self, event):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Hoja actual.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hoja_actual = self.panel.&lt;b&gt;&lt;span style="color: #741b47;"&gt;GetSelection()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Número total de hojas.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total_hojas = self.panel.&lt;b&gt;&lt;span style="color: #741b47;"&gt;GetPageCount()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Algo de información antes de buscar datos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cadena = "Este AUI NoteBook tiene %s hojas. Estás en la %s" % \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (total_hojas,hoja_actual)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.MessageBox(cadena,"Info",wx.OK)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Recorremos las hojas, obteniendo la información requerida.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; texto = ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(0,total_hojas):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Texto en la etiqueta de la hoja.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; texto_etiqueta = self.panel.&lt;b&gt;&lt;span style="color: #741b47;"&gt;GetPageText(i)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Datos de las cajas de texto de la hoja i.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dato1 = &lt;b style="color: #741b47;"&gt;self.panel.GetPage(i).c1.GetValue()&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dato2 = &lt;b style="color: #741b47;"&gt;self.panel.GetPage(i).c2.GetValue()&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Info.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; texto += u'''&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; La hoja número %s, con etiqueta "%s" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contiene los datos:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Caja de texto: %s &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Caja de texto: %s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' % (i, texto_etiqueta, dato1, dato2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Mostramos los datos por pantalla.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.MessageBox(texto, "Datos", wx.OK)&lt;br /&gt;&lt;br /&gt;Puff!. Vaya, esta clase es algo más larga. Pero no hay problema, la comentamos poco a poco, que es muy fácil de entender. Se puede decir que esta clase implementa la creación de hojas por una parte y el recorrido de dichas hojas a partir de la generación de un evento por hacer click en un botón. Bien, veámoslo por partes.&lt;br /&gt;&lt;br /&gt;Esta clase hereda de &lt;b&gt;wx.Frame&lt;/b&gt;, por lo que es un &lt;i&gt;frame&lt;/i&gt; (una ventana típica de &lt;i&gt;Windows&lt;/i&gt;).&amp;nbsp; En dicho &lt;i&gt;frame&lt;/i&gt; se ha utilizado un &lt;i&gt;sizer&lt;/i&gt; vertical para posicionar un botón (&lt;b&gt;wx.Button&lt;/b&gt;) y un componente &lt;b&gt;AUI_Notebook&lt;/b&gt;. Si vemos el código, justo después de instanciar el &lt;b&gt;AUI_Notebook&lt;/b&gt;, instanciamos tres hojas del modo:&lt;br /&gt;&lt;br /&gt;&lt;div style="color: black;"&gt;hoja&lt;b&gt;&lt;span style="color: red;"&gt;i&lt;/span&gt;&lt;/b&gt; = &lt;b&gt;hoja_notebook&lt;/b&gt;(self.panel, "&lt;b&gt;&lt;span style="color: red;"&gt;XXX&lt;/span&gt;&lt;/b&gt; hoja")&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Esto es, hemos utilizado la clase &lt;b&gt;&lt;span style="color: orange;"&gt;hoja_notebook&lt;/span&gt;&lt;/b&gt; para crear 3 hojas. Darse cuenta que el padre de las hojas es el propio &lt;b&gt;AUI_Notebook&lt;/b&gt;. Mediante el método &lt;b&gt;AddPage&lt;/b&gt; se añaden las hojas. Además, se ha creado un &lt;i&gt;binding&lt;/i&gt; para cuando se genere el evento de hacer click en el botón.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Dicho evento&amp;nbsp; (&lt;b&gt;wx.EVT_BUTTON&lt;/b&gt;) lanza el manejador de eventos &lt;b&gt;OnClickBoton&lt;/b&gt;, que se encargará de realizar el recorrido entre todas las hojas, así como mostrar información sobre el posicionamiento de las mismas. Mediante los métodos &lt;b&gt;GetSelection()&lt;/b&gt; y &lt;b&gt;GetPageText(&lt;/b&gt;&lt;span style="color: red;"&gt;i&lt;/span&gt;&lt;b&gt;)&lt;/b&gt; se obtiene la hoja actual, así como el texto de la etiqueta.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Lo que se hace en realidad es recorrer todas las hojas y buscar la información entre los objetos de cajas de texto, mediante:&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;b style="color: #741b47;"&gt;&lt;span style="color: blue;"&gt;self.panel.GetPage(&lt;span style="color: red;"&gt;i&lt;/span&gt;)&lt;/span&gt;&lt;span style="color: #274e13;"&gt;.c1.GetValue()&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Como el lector puede observar con &lt;b&gt;GetPage&lt;/b&gt; se obtiene el objeto &lt;b&gt;hoja_notebook&lt;/b&gt;. Únicamente hay que acceder a sus atributos (&lt;span style="color: purple;"&gt;c1&lt;/span&gt;, &lt;span style="color: purple;"&gt;c2&lt;/span&gt;) y con el método &lt;b&gt;GetValue()&lt;/b&gt; (de &lt;b&gt;wx.TextCtrl&lt;/b&gt;) se obtiene el texto que recoge.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;El código para hacer funcionar este programa podría ser tal que así:&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;app = wx.PySimpleApp()&lt;br /&gt;frame = frame_principal(None)&lt;br /&gt;frame.Show()&lt;br /&gt;app.MainLoop()&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Veamos capturas del ejemplo para ver que efectivamente funciona...&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Ejecutamos. &lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kOleaMxg2ck/TdWD3ONLepI/AAAAAAAABQ0/8fZ85vClIKg/s1600/a1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="459" src="http://4.bp.blogspot.com/-kOleaMxg2ck/TdWD3ONLepI/AAAAAAAABQ0/8fZ85vClIKg/s640/a1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Incluimos datos.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-q6mhyQTOq4k/TdWD3n0M5bI/AAAAAAAABQ4/9lz39yDFZYg/s1600/a2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="457" src="http://2.bp.blogspot.com/-q6mhyQTOq4k/TdWD3n0M5bI/AAAAAAAABQ4/9lz39yDFZYg/s640/a2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IxI0Pj2ilfo/TdWD5RkQnfI/AAAAAAAABQ8/bcQQx6N1aZ4/s1600/a3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="456" src="http://4.bp.blogspot.com/-IxI0Pj2ilfo/TdWD5RkQnfI/AAAAAAAABQ8/bcQQx6N1aZ4/s640/a3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LkaDOde113c/TdWD6hV_ByI/AAAAAAAABRA/cXY5Uq0iH9Q/s1600/a4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="464" src="http://3.bp.blogspot.com/-LkaDOde113c/TdWD6hV_ByI/AAAAAAAABRA/cXY5Uq0iH9Q/s640/a4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Al hacer click en el botón "Devolver datos", teniendo en cuenta que estamos en la última hoja, tenemos...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-FuuczNZxzc0/TdWD6x6Hy5I/AAAAAAAABRE/IoIsWf6Q7Po/s1600/a5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-FuuczNZxzc0/TdWD6x6Hy5I/AAAAAAAABRE/IoIsWf6Q7Po/s1600/a5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-63kTjX2l2f8/TdWD7suf4nI/AAAAAAAABRI/6dU02Dv6mSc/s1600/a6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-63kTjX2l2f8/TdWD7suf4nI/AAAAAAAABRI/6dU02Dv6mSc/s1600/a6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&amp;nbsp;CONCLUSIONES&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;En este artículo hemos visto de una manera muy sencilla el componente &lt;b&gt;AUI_Notebook&lt;/b&gt;, que podemos ver en más profundidad en la &lt;b&gt;Demo de wxPython&lt;/b&gt;. Se ha creado una aplicación muy sencilla, que se compone de una clase de tipo &lt;b&gt;wx.Panel&lt;/b&gt; que define una hoja y una clase &lt;b&gt;wx.Frame&lt;/b&gt; que incluye un componente &lt;b&gt;AUI_Notebook&lt;/b&gt;. Las hojas del &lt;b&gt;AUI_Notebook&lt;/b&gt; son instanciaciones de la clase hoja que hemos creado. Además se han visto algunos métodos para acceder a las hojas, así como la manera de obtener los datos que un posible usuario hubiera incluido en las hojas.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-704403081005372294?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/704403081005372294/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/05/wxpython-obtener-datos-de-las-hojas-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/704403081005372294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/704403081005372294'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/05/wxpython-obtener-datos-de-las-hojas-de.html' title='wxPython: Obtener datos de las hojas de un AUI_Notebook'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-kOleaMxg2ck/TdWD3ONLepI/AAAAAAAABQ0/8fZ85vClIKg/s72-c/a1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-135895435267628710</id><published>2011-05-12T17:45:00.000+02:00</published><updated>2011-05-13T15:09:27.424+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lorca'/><title type='text'>Lorca muy tocada...</title><content type='html'>Hola. Como el lector debe de saber ya soy de &lt;b&gt;Lorca&lt;/b&gt;. Ayer sufrimos 2 terremotos que han dejado la ciudad con un 80% de daños en infraestructuras. Mi casa no ha sido una excepción, por lo que no se cuando volveré a escribir. Lo primero es lo primero.&lt;br /&gt;&lt;br /&gt;Espero que sea pronto.&lt;br /&gt;&lt;br /&gt;Un cordial saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-135895435267628710?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/135895435267628710/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/05/lorca-muy-tocada.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/135895435267628710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/135895435267628710'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/05/lorca-muy-tocada.html' title='Lorca muy tocada...'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1360521011309337567</id><published>2011-04-14T00:04:00.000+02:00</published><updated>2011-04-14T00:04:32.267+02:00</updated><title type='text'>Charla sobre Python y wxPython en Almería (IES Al-Andalus)</title><content type='html'>Hola. El Jueves 14 de Abril daré una charla de una hora (prometo no sobrepasarme en el tiempo) sobre &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;, en el &lt;b&gt;IES Al-Ándalus&lt;/b&gt;, en Almería ciudad, en las&amp;nbsp;&lt;b&gt;Jornadas SLCENT 7.0&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;El programa está &lt;a href="http://www.iesalandalus.org/moodle/file.php/135/Programa_Jornadas_SLCENT_7.pdf"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La hora es a las 20:30 de la tarde. Lo que pretendo es dar una visión general de &lt;b&gt;Python&lt;/b&gt;, sin entrar en ningún tipo de matiz, y ver por encima la plataforma de desarrollo de interfaces gráficas&lt;b&gt; wxPython&lt;/b&gt;, con ejemplos.&lt;br /&gt;&lt;br /&gt;Será una charla de ver por donde empezar para llegar a buen puerto.&lt;br /&gt;&lt;br /&gt;El material que expondré lo dejo como siempre en el &lt;a href="https://sites.google.com/site/elviajedelnavegante/"&gt;repositorio de este blog&lt;/a&gt;. Es muy parecido a la charla de la &lt;b&gt;Lan Party 2010&lt;/b&gt;, pero he quitado muchas cosas (código) y añadido otras (capturas de pantalla de &lt;b&gt;wxPython&lt;/b&gt;), con lo que creo la presentación gana en legibilidad y soltura.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1360521011309337567?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1360521011309337567/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/04/charla-sobre-python-y-wxpython-en.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1360521011309337567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1360521011309337567'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/04/charla-sobre-python-y-wxpython-en.html' title='Charla sobre Python y wxPython en Almería (IES Al-Andalus)'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4176657650321311990</id><published>2011-03-29T10:26:00.000+02:00</published><updated>2011-03-29T10:26:45.667+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='universidad de murcia'/><category scheme='http://www.blogger.com/atom/ns#' term='clasificación'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmia'/><category scheme='http://www.blogger.com/atom/ns#' term='monedas'/><title type='text'>Algoritmos de clasificación y problema de cambio de monedas, en C</title><content type='html'>Hola. Revisando el disco duro de hace algunos años me he encontrado con unas prácticas de la carrera (del 2003-2004), el análisis y diseño de algoritmos de clasificación y la resolución del ejercicio (mediante ciertas técnicas) de cambio de monedas. Bien , pues ya es hora de compartir este trabajo, por si alguien lo necesita. Estos trabajos están hechos en &lt;b&gt;C&lt;/b&gt;, en plataforma &lt;b&gt;Linux&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Se pueden descargar del repositorio de este &lt;b&gt;blog&lt;/b&gt;, en:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/documentacion"&gt;https://sites.google.com/site/elviajedelnavegante/documentacion&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Los ficheros son&lt;b&gt;&amp;nbsp;ALGORITMOS DE ORDENACION.zip&lt;/b&gt; y &lt;b&gt;PROBLEMA DEL CAMBIO DE MONEDAS.zip&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;Algoritmos de ordenación&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este trabajo recoge el análisis, diseño e implementación, en C, de los algoritmos de clasificación más importantes, a saber:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de selección directa.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de burbuja.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de inserción directa.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de burbuja mejorado.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de QuickSort.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de MergeSort.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de QuickSort no recursivo.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de MergeSort no recursivo.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Algoritmo de QuickSort con elección de pivote.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Aquí se incluyen estudios de coste promedio, estudio teórico del tiempo de ejecución, estudios experimentales de todos los algoritmos de clasificación, etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Cambio de monedas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Resolución del problema de cambio de monedas por&lt;b&gt; backtracking&lt;/b&gt; (árbol de soluciones, tiempos de ejecución, reducción de número de nodos e implementación) y por &lt;b&gt;programación dinámica&lt;/b&gt; (ecuación de recurrencia y solución óptima, estudio teórico del tiempo de ejecución e implementación).&lt;br /&gt;&lt;br /&gt;Por último comentar que los ficheros &lt;b&gt;.zip&lt;/b&gt; contienen tanto la documentación como los fuentes, incluidos los &lt;b&gt;Makefile&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4176657650321311990?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4176657650321311990/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/algoritmos-de-clasificacion-y-problema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4176657650321311990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4176657650321311990'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/algoritmos-de-clasificacion-y-problema.html' title='Algoritmos de clasificación y problema de cambio de monedas, en C'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-2066030381845101296</id><published>2011-03-22T21:58:00.001+01:00</published><updated>2011-03-22T22:02:53.315+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='stringIO'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='tokenize'/><title type='text'>Script para pasar código Python a HTML</title><content type='html'>Hola. En este artículo vamos a crear un &lt;b&gt;script&lt;/b&gt; para pasar código fuente &lt;b&gt;Python&lt;/b&gt; (&lt;b&gt;.py&lt;/b&gt;) a formato &lt;b&gt;HTML&lt;/b&gt; (y de esta manera mostrar dicho código en una página &lt;b&gt;web&lt;/b&gt;). Además vamos a darle &amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;coloración&lt;/span&gt;&lt;/i&gt;&amp;nbsp;al código &lt;b&gt;Python&lt;/b&gt;. Debe de haber formas más simples, sin duda, de resolver este tipo de problemáticas, ... a mí se me ha ocurrido esta.&lt;br /&gt;&lt;br /&gt;Como siempre, el fichero &lt;b&gt;.py&lt;/b&gt; que contiene el &lt;b&gt;script&lt;/b&gt; se puede obtener del repositorio de este &lt;b&gt;blog&lt;/b&gt;, en:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/"&gt;https://sites.google.com/site/elviajedelnavegante/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El fichero se llama &lt;b&gt;mi_tokenize.zip&lt;/b&gt;, el cual contiene el script&lt;b&gt; mi_tokenize.py&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;En este problema no se ha utilizado programación orientada a objetos, esto es, no se implementa ninguna clase. Todo se resuelve con programación imperativa (mediante funciones).&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: x-large;"&gt;&lt;b&gt;Al grano...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El funcionamiento es sencillo, en términos generales. De lo que se trata es que, a partir de un fichero de código fuente&lt;b&gt; Python&lt;/b&gt;, se genera otro (con extensión html) con código &lt;b&gt;HTML&lt;/b&gt;, que representa el código &lt;b&gt;Python&lt;/b&gt; formateado (con indentación y coloreado de código).&lt;br /&gt;&lt;br /&gt;Un ejemplo sería el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-SSI6IRzRJLM/TYjX9l4vgcI/AAAAAAAABQM/mkxupdEzbmI/s1600/python_a_html1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-SSI6IRzRJLM/TYjX9l4vgcI/AAAAAAAABQM/mkxupdEzbmI/s1600/python_a_html1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La captura de arriba es del &lt;b&gt;Stani's Python Editor&lt;/b&gt;. Abajo nos encontramos el mismo código, formateado en &lt;b&gt;HTML&lt;/b&gt; y coloreado, en &lt;b&gt;Firefox&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-mULfi5BleSU/TYjX_xJjftI/AAAAAAAABQQ/mn_DjgkeHdA/s1600/python_a_html2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="537" src="https://lh3.googleusercontent.com/-mULfi5BleSU/TYjX_xJjftI/AAAAAAAABQQ/mn_DjgkeHdA/s640/python_a_html2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: x-large;"&gt;¿Cómo enfocar el problema?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Pasar código &lt;b&gt;Python&lt;/b&gt; a &lt;b&gt;html&lt;/b&gt; es casi trivial. Únicamente hay que abrir un fichero &lt;b&gt;.py&lt;/b&gt;, leerlo, crear otro fichero con una cabecera&lt;b&gt; html&lt;/b&gt;, incluir dicho código &lt;b&gt;Python&lt;/b&gt; y cerrar el &lt;b&gt;html&lt;/b&gt;. Listo, ya tenemos el código en una página web.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;El verdadero problema es el coloreado del código, ya que se tiene que identificar los diferentes bloques de código a los que se quieren dar color. En nuestro caso, daremos color a los &lt;i&gt;&lt;u&gt;comentarios&lt;/u&gt;&lt;/i&gt;, a las&lt;i&gt;&lt;u&gt; cadenas&lt;/u&gt;&lt;/i&gt; y a las &lt;i&gt;&lt;u&gt;palabras clave&lt;/u&gt;&lt;/i&gt; de la versión que utilicemos de &lt;b&gt;Python&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;¿Cómo hacerlo? Mediante los módulos&amp;nbsp;&lt;b&gt;cStringIO&lt;/b&gt; y &lt;b&gt;tokenize&lt;/b&gt;, que se pueden encontrar en cualquier distribución de &lt;b&gt;Python&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;cStringIO&lt;/b&gt; sirve para crear, a partir de una cadena, un buffer de cadena. &lt;b&gt;tokenize&lt;/b&gt; es el módulo que nos permite analizar código &lt;b&gt;Python&lt;/b&gt; e identificar componentes del mismo (comentarios, cadenas, etc) a partir de un buffer de cadena. Mejor lo vemos con los pasos que debe de dar nuestro script:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;1) Cargamos en memoria un fichero &lt;b&gt;.py&lt;/b&gt; con el método &lt;b&gt;read()&lt;/b&gt; de &lt;b&gt;open&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;2) Mediante &lt;b&gt;cStringIO&lt;/b&gt; creamos un fichero en memoria ó buffer de cadena, el cual es necesario para utilizar el &lt;b&gt;tokenize&lt;/b&gt;. En realidad esto sirve para iterar, línea a línea sobre una cadena con varias líneas (con saltos de línea). Por ejemplo:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;import cStringIO&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;cadena = '''&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Este es un ejemplo&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;de la potencia del&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;módulo cStringIO&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;texto = cStringIO.StringIO(cadena)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;for i in texto: print i&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Devuelve:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;Este es un ejemplo&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;de la potencia del&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;módulo cStringIO&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;3) Mediante &lt;b&gt;tokenize&lt;/b&gt;, y a partir del buffer de cadena creado en el paso anterior, podemos obtener los token (elementos de código), iterando sobre ellos, e identificando los elementos de código &lt;b&gt;Python&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;En la documentación de &lt;b&gt;Python&lt;/b&gt; tenéis una explicación muy buena (en inglés) de estos dos módulos:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://docs.python.org/library/stringio.html#module-cStringIO"&gt;http://docs.python.org/library/stringio.html#module-cStringIO&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://docs.python.org/library/tokenize.html"&gt;http://docs.python.org/library/tokenize.html&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Puff!!! Una explicación algo extraña. Veámoslo con un ejemplo. Imaginemos que hemos cargado mediante el método&lt;b&gt; read()&lt;/b&gt; de &lt;b&gt;open&lt;/b&gt; un fichero con código &lt;b&gt;Python&lt;/b&gt; con el siguiente contenido:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;# Código Python.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;for i in range(0,5):&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;print "Número ", i&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Mediante los pasos anteriores vamos a identificar los elementos del código, a saber, comentarios, palabras clave y cadenas. El código que haría esta operación podría ser el siguiente:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Creamos buffer de cadena.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;texto =&lt;span class="Apple-style-span" style="color: purple;"&gt; cStringIO.StringIO(&lt;/span&gt;cadena&lt;span class="Apple-style-span" style="color: purple;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Creamos tokens.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;tokens = &lt;span class="Apple-style-span" style="color: purple;"&gt;tokenize.generate_tokens(&lt;/span&gt;texto.readline&lt;span class="Apple-style-span" style="color: purple;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;for a,b,c,d,_ in tokens:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;if a == &lt;span class="Apple-style-span" style="color: purple;"&gt;tokenize.STRING&lt;/span&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Cadena: %s en posición [%s,%s]" %( b,c,d)&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;if a == &lt;span class="Apple-style-span" style="color: purple;"&gt;tokenize.NAME&lt;/span&gt; and &lt;span class="Apple-style-span" style="color: magenta;"&gt;b in keyword.kwlist&lt;/span&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Palabra clave: %s en posición [%s,%s]" % (b,c,d)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;if a == &lt;span class="Apple-style-span" style="color: purple;"&gt;tokenize.COMMENT&lt;/span&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Comentario: %s en posición [%s,%s]" % (b,c,d)&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Dando como resultado:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Comentario: &lt;b&gt;# -*- coding: utf-8 -*-&lt;/b&gt; en posición [(1, 0),(1, 23)]&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Comentario: &lt;b&gt;# Código Python.&lt;/b&gt; en posición [(2, 0),(2, 17)]&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Palabra clave: &lt;b&gt;for&lt;/b&gt; en posición [(3, 0),(3, 3)]&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Palabra clave: &lt;b&gt;in&lt;/b&gt; en posición [(3, 6),(3, 8)]&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Palabra clave: &lt;b&gt;print&lt;/b&gt; en posición [(4, 2),(4, 7)]&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Cadena: &lt;b&gt;"Número "&lt;/b&gt; en posición [(4, 8),(4, 18)]&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Por tanto, mediante el módulo &lt;b&gt;tokenize&lt;/b&gt; podemos identificar todos los elementos de los que se compone un código &lt;b&gt;Python&lt;/b&gt;. La idea fundamental es esta. Aparte, mediante operaciones de transformación entre listas y cadenas, y demás operaciones se llega al resultado esperado.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;¿Y cómo se colorea el texto? Pues mediante código &lt;b&gt;HTML&lt;/b&gt; del tipo:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-N9sbQmdCOWI/TYkD-ofNFiI/AAAAAAAABQU/oTghaUWJAkc/s1600/span.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-N9sbQmdCOWI/TYkD-ofNFiI/AAAAAAAABQU/oTghaUWJAkc/s1600/span.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Así el otro hándicap es que a partir de las coordenadas de los elementos de código a colorear hay que insertar código &lt;b&gt;HTML&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: x-large;"&gt;El script mi_tokenize.py&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Tal como antes se ha comentado, el lector puede obtener el código de este &lt;b&gt;script&lt;/b&gt; en el repositorio de &lt;a href="https://sites.google.com/site/elviajedelnavegante/"&gt;El viaje del navegante&lt;/a&gt;. Aquí se presentan capturas de pantalla del código, debido principalmente a que se utiliza sintaxis &lt;b&gt;html&lt;/b&gt; en el código &lt;b&gt;Python&lt;/b&gt;, y no mezclar cosas.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Módulos que se cargan y estructuras que se definen:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-krBypFRO2hE/TYkHtM06NNI/AAAAAAAABQc/6KZhEWOLotE/s1600/c0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-krBypFRO2hE/TYkHtM06NNI/AAAAAAAABQc/6KZhEWOLotE/s1600/c0.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Importamos los módulos necesarios y creamos un diccionario para colorear los elementos de código &lt;b&gt;Python&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;El código principal que ejecuta el script:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-kWDklm11w7Q/TYkGRFC1nbI/AAAAAAAABQY/78TOdt08Lfk/s1600/c1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-kWDklm11w7Q/TYkGRFC1nbI/AAAAAAAABQY/78TOdt08Lfk/s1600/c1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Podemos observar que el &lt;b&gt;script&lt;/b&gt; pide dos argumentos para funcionar, el primero el fichero &lt;b&gt;Python&lt;/b&gt; y el segundo el nombre del fichero &lt;b&gt;html&lt;/b&gt; que se generará (se le da extensión &lt;b&gt;.html&lt;/b&gt; si esta se omite) . A continuación llamamos a la función &lt;i&gt;cargar_fichero&lt;/i&gt; que devuelve, mediante &lt;b&gt;read()&lt;/b&gt; una cadena con el contenido del fichero. Finalmente, mediante la función &lt;i&gt;tokenizar_codigo&lt;/i&gt; se crea una cadena con sintaxis &lt;b&gt;html&lt;/b&gt; y &lt;b&gt;Python&lt;/b&gt;, que se guarda en el fichero identificado por &lt;i&gt;f_html_nombre&lt;/i&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Función para cargar el fichero &lt;b&gt;.py&lt;/b&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-n3eVvQbSvt0/TYkIYZf7Z_I/AAAAAAAABQg/yTCA4aK4od0/s1600/c2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-n3eVvQbSvt0/TYkIYZf7Z_I/AAAAAAAABQg/yTCA4aK4od0/s1600/c2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Darse cuenta que reemplazamos ciertos caracteres especiales en &lt;b&gt;html&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;La función que analiza el código creando una cadena con &lt;b&gt;html&lt;/b&gt; y código &lt;b&gt;Python&lt;/b&gt; es la siguiente:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-UYZuMH44di4/TYkJO2rTFVI/AAAAAAAABQk/V7DSqTXCxTE/s1600/c3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-UYZuMH44di4/TYkJO2rTFVI/AAAAAAAABQk/V7DSqTXCxTE/s1600/c3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-Vqc1No6nfiE/TYkJRWEmWPI/AAAAAAAABQo/UF8-Ig6WTUI/s1600/c4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-Vqc1No6nfiE/TYkJRWEmWPI/AAAAAAAABQo/UF8-Ig6WTUI/s1600/c4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Esta función podría haberse escrito de otra forma, para ahorrar código, pero me ha parecido más pedagógico realizarlo de esta forma. Como se puede observar se utilizan &lt;b&gt;cStringIO&lt;/b&gt; y &lt;b&gt;tokenize&lt;/b&gt;. Devuelve una cadena con código &lt;b&gt;html&lt;/b&gt;. Esta última función utiliza dos funciones auxiliares, a saber:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;La función para insertar los elementos de &lt;b&gt;html&lt;/b&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-CSPaCzYwpJk/TYkLTCAZ-ZI/AAAAAAAABQs/YvN0I2b7Owo/s1600/c5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-CSPaCzYwpJk/TYkLTCAZ-ZI/AAAAAAAABQs/YvN0I2b7Owo/s1600/c5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y la función para incluir la cabecera y pie del documento de la página &lt;b&gt;web&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-zDHj74ZSbbM/TYkLTu-z2ZI/AAAAAAAABQw/rxPjjLXDN-s/s1600/c6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-zDHj74ZSbbM/TYkLTu-z2ZI/AAAAAAAABQw/rxPjjLXDN-s/s1600/c6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Pero como no es lo mismo andar el camino que conocer el camino, es mejor probar el&lt;b&gt; script&lt;/b&gt;. El lector puede pensar que sería mucho mejor utilizar &lt;b&gt;CSS&lt;/b&gt; para estos menesteres, y en cierta manera, es verdad, pero no es objetivo de este post hacer un tratado sobre &lt;b&gt;web&lt;/b&gt; y&lt;b&gt; CSS&lt;/b&gt;. Lo verdaderamente importante es el parseo de código &lt;b&gt;Python&lt;/b&gt; y el tratamiento de cadenas.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Se insta al lector a mejorar el código.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-2066030381845101296?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/2066030381845101296/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/script-para-pasar-codigo-python-html.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/2066030381845101296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/2066030381845101296'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/script-para-pasar-codigo-python-html.html' title='Script para pasar código Python a HTML'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-SSI6IRzRJLM/TYjX9l4vgcI/AAAAAAAABQM/mkxupdEzbmI/s72-c/python_a_html1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8732872320135926482</id><published>2011-03-20T12:12:00.000+01:00</published><updated>2011-03-20T12:12:41.343+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='dosbox'/><category scheme='http://www.blogger.com/atom/ns#' term='juegos'/><title type='text'>Mis antiguos juegos DOS en mi nuevo Linux Ubuntu</title><content type='html'>Hola. Este no es un post sobre &lt;i&gt;Python&lt;/i&gt;, pero tenía que escribirlo, ya que llevo emocionado toda la mañana jugando a mis antiguos juegos de&lt;b&gt; MS-DOS&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Mi primer &lt;b&gt;PC&lt;/b&gt; fue allá por 1988 ú 89, ya no recuerdo. Un &lt;b&gt;8086&lt;/b&gt; de &lt;b&gt;640 Kb&lt;/b&gt;, diskettera de 5 un cuarto y otra de 3 y medio. Monitor CGA monocromo (luego cambiaría a un TARGA VGA, todo un lujo). Por supuesto, un sistema operativo &lt;b&gt;MS-DOS 3.22&lt;/b&gt;, que era lo máximo.&lt;br /&gt;&lt;br /&gt;Hacía mis pinitos con &lt;b&gt;Logo&lt;/b&gt; (AV, GD, GI, ...) y luego &lt;b&gt;GW-BASIC&lt;/b&gt; (return, goto's, ...). Ahí es donde empezó mi curiosidad por la profesión, que ya viene de lejos.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;Pero lo mejor, de verdad, lo mejor, eran los videojuegos. Unas auténticas joyas de programación, con los recursos hardware tan limitados que había por aquel entonces&amp;nbsp;(comparado con ahora, claro)&amp;nbsp;.&lt;br /&gt;&lt;br /&gt;Yo no soy ningún entusiasta de los juegos de hoy día (de hecho, no juego), pero sí de los de mi época ochentera y noventera (el último el &lt;b&gt;PC-FUTBOL 6.0&lt;/b&gt;, ¡qué maravilla!).&lt;br /&gt;&lt;br /&gt;En mi nuevo &lt;b&gt;Linux &lt;/b&gt;he descubierto que también está el &lt;b&gt;DOSBox&lt;/b&gt; (que ya utilicé alguna vez en &lt;b&gt;Windows&lt;/b&gt;), el cual es un emulador de entornos &lt;b&gt;MS-DOS&lt;/b&gt;. Lo he instalado desde el &lt;b&gt;Centro de software de Ubuntu&lt;/b&gt;. Hay muchas posibles configuraciones de esta aplicación. Aquí hay algunas guías:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.arcades3d.com/textos/tutdosbox_uso.var"&gt;http://www.arcades3d.com/textos/tutdosbox_uso.var&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://manualinux.my-place.us/dosbox.html"&gt;http://manualinux.my-place.us/dosbox.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dosbox.com/DOSBoxManual.html"&gt;http://www.dosbox.com/DOSBoxManual.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lo único que he configurado para hacer funcionar &lt;b&gt;DOSBox&lt;/b&gt;&amp;nbsp;ha sido modificar la etiqueta &lt;b&gt;[autoexec]&lt;/b&gt; del fichero de configuración &lt;b&gt;dosbox-0.73.conf&lt;/b&gt;, que se encuentra en el directorio &lt;b&gt;./dosbox&lt;/b&gt; de la carpeta de usuario.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-pM5XKFwuzls/TYXbrYL8L0I/AAAAAAAABP4/JV9-lDpQ-cg/s1600/Pantallazo-*dosbox-0.73.conf+%2528%257E-.dosbox%2529+-+gedit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="433" src="https://lh3.googleusercontent.com/-pM5XKFwuzls/TYXbrYL8L0I/AAAAAAAABP4/JV9-lDpQ-cg/s640/Pantallazo-*dosbox-0.73.conf+%2528%257E-.dosbox%2529+-+gedit.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como se puede observar he incluido la configuración del teclado al español:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;keyb sp 437&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;y he montado la unidad C: en el directorio donde tengo todos mis juegos DOS, mediante:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mount c /home/angel/juegos/dos&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;Arrancas el emulador DOSBox...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-0kIeUJ54oNU/TYXcXm_gugI/AAAAAAAABP8/xvEZJaNE6p0/s1600/Pantallazo-DOSBox+0.73%252C+Cpu+Cycles%253A+++++3000%252C+Frameskip++0%252C+Program%253A+++DOSBOX.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://lh4.googleusercontent.com/-0kIeUJ54oNU/TYXcXm_gugI/AAAAAAAABP8/xvEZJaNE6p0/s640/Pantallazo-DOSBox+0.73%252C+Cpu+Cycles%253A+++++3000%252C+Frameskip++0%252C+Program%253A+++DOSBOX.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Increíble la sensación de jugar a juegos &lt;b&gt;DOS&lt;/b&gt; desde un &lt;b&gt;Linux&lt;/b&gt;!!!! Y lo mejor de todo, que funcionan a la velocidad de tu antiguo &lt;b&gt;PC&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;Xenon 2&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Un clásico de arcades. Y menuda música que tiene (el altavoz echaba chispas)!!!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-Rlbpqo3FhLs/TYXdy_TduxI/AAAAAAAABQA/Uj_THH1pqpE/s1600/Pantallazo-DOSBox+0.73%252C+Cpu+Cycles%253A+++++3000%252C+Frameskip++0%252C+Program%253A+++XENON2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-Rlbpqo3FhLs/TYXdy_TduxI/AAAAAAAABQA/Uj_THH1pqpE/s1600/Pantallazo-DOSBox+0.73%252C+Cpu+Cycles%253A+++++3000%252C+Frameskip++0%252C+Program%253A+++XENON2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-mB0RjSE8nIQ/TYXeeFAL3fI/AAAAAAAABQE/yi6wzJ2IJ0Y/s1600/+++Pantallazo-DOSBox+0.73%252C+Cpu+Cycles%253A+++++3000%252C+Frameskip++0%252C+Program%253A+++XENON2-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-mB0RjSE8nIQ/TYXeeFAL3fI/AAAAAAAABQE/yi6wzJ2IJ0Y/s1600/+++Pantallazo-DOSBox+0.73%252C+Cpu+Cycles%253A+++++3000%252C+Frameskip++0%252C+Program%253A+++XENON2-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;Digger&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¿Quién no ha jugado a este juego? ¿Y la música del Pop-corn? Bestial!!!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-j3oGmALHVBU/TYXe9X2NaiI/AAAAAAAABQI/dHeurOlWI1s/s1600/8444442.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-j3oGmALHVBU/TYXe9X2NaiI/AAAAAAAABQI/dHeurOlWI1s/s1600/8444442.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y otros clásicos como &lt;b&gt;Arkanoid&lt;/b&gt;, &lt;b&gt;Volfied&lt;/b&gt;, &lt;b&gt;Pacman&lt;/b&gt;, &lt;b&gt;Striker&lt;/b&gt;, &lt;b&gt;Rampage&lt;/b&gt;, &lt;b&gt;Tetris&lt;/b&gt; (&lt;i&gt;el auténtico de 1986&lt;/i&gt;), &lt;b&gt;Sol Negro&lt;/b&gt;, .... En total tengo unos 118 juegos de los ahora denominados &lt;i&gt;&lt;u&gt;Abandonware&lt;/u&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Y no sé porqué, pero estos juegos, para mí, son mucho más adictivos e impresionantes que los de hoy día, &lt;b&gt;¡Y TODO EN MI LINUX!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8732872320135926482?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8732872320135926482/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/mis-antiguos-juegos-dos-en-mi-nuevo.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8732872320135926482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8732872320135926482'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/mis-antiguos-juegos-dos-en-mi-nuevo.html' title='Mis antiguos juegos DOS en mi nuevo Linux Ubuntu'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-pM5XKFwuzls/TYXbrYL8L0I/AAAAAAAABP4/JV9-lDpQ-cg/s72-c/Pantallazo-*dosbox-0.73.conf+%2528%257E-.dosbox%2529+-+gedit.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1978099768990933847</id><published>2011-03-15T10:41:00.002+01:00</published><updated>2011-03-15T10:43:47.438+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='python.ide'/><title type='text'>Me cambio a Linux</title><content type='html'>Hola. Después de algunos años en sistemas &lt;b&gt;Windows XP&lt;/b&gt; (desde &lt;i&gt;2003&lt;/i&gt;, en donde dejé abandonada a su suerte a mi fabulosa &lt;b&gt;RedHat 6&lt;/b&gt;), me vuelvo a &lt;i&gt;Linux&lt;/i&gt;, a &lt;b&gt;Linux &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;&lt;/b&gt; definitivamente, con &lt;b&gt;&lt;a href="http://www.python.org/download/releases/2.6.6/"&gt;Python 2.6.6&lt;/a&gt;&lt;/b&gt; y como &lt;b&gt;IDE&lt;/b&gt; de desarrollo el&lt;b&gt; &lt;a href="http://sourceforge.net/projects/spe/"&gt;Stani's Python Editor&lt;/a&gt;&lt;/b&gt; (&lt;i&gt;&lt;a href="http://pythonide.blogspot.com/"&gt;SPE&lt;/a&gt;&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;A partir de este post, todo lo que escriba se realizará en esta plataforma. La razón para el cambio es el intento de trabajar con &lt;b&gt;Windows 7&lt;/b&gt;, en mi &lt;i&gt;PC&lt;/i&gt;. La consecuencia: Un SO tiene que ayudar al desarrollador, y en mi caso, con mi máquina, eso es muy complicado (¡tarda más en ponerse en marcha que ejecutar &lt;b&gt;&lt;a href="http://wiki.netbeans.org/Python"&gt;NetBeans&lt;/a&gt;&lt;/b&gt; en un 486!).&lt;br /&gt;&lt;br /&gt;No intento desprestigiar la familia de SO's&amp;nbsp;&lt;b&gt;Windows 7&lt;/b&gt; ni nada parecido. Únicamente, que no es bueno para mí. Y como mi &lt;b&gt;Linux Ubuntu 10.04&lt;/b&gt; no me da problemas de rendimiento, pues me quedo aquí.&lt;br /&gt;&lt;br /&gt;Por último decir que si por alguna excepción escribiera algo para &lt;i&gt;Windows&lt;/i&gt;, sería con &lt;b&gt;Windows XP SP3&lt;/b&gt;, y con el &lt;b&gt;IDE &lt;a href="http://mmm-experts.com/Products.aspx?ProductId=4"&gt;PyScripter&lt;/a&gt;&lt;/b&gt;, uno de los entornos de desarrollo más potentes para &lt;b&gt;Python&lt;/b&gt; en plataformas de &lt;i&gt;Microsoft&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1978099768990933847?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1978099768990933847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/me-cambio-linux.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1978099768990933847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1978099768990933847'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/me-cambio-linux.html' title='Me cambio a Linux'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1515544598944947522</id><published>2011-03-01T21:48:00.002+01:00</published><updated>2011-03-01T21:51:02.770+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wx'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>Pasar parámetros entre frames en wxPython</title><content type='html'>Hola. En este artículo vamos a ver una forma muy sencilla de pasar parámetros entre 2 frames en &lt;b&gt;wxPython&lt;/b&gt;, uno padre de otro. El paso de mensajes ó parámetros entre objetos se puede hacer de varias formas, siendo la que vamos a ver una de las más fáciles.&lt;br /&gt;&lt;br /&gt;Aunque lo vamos a ver con un ejemplo (esto es, código), no está de más explicar el funcionamiento. La aplicación es un fichero&lt;b&gt; .py&lt;/b&gt; donde tenemos una aplicación &lt;b&gt;wxPython&lt;/b&gt;, que instancia una clase &lt;span style="color: blue;"&gt;(frame_principal&lt;/span&gt;). Dicha clase, al hacer click en un botón instancia una segunda clase (&lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt;). Cuando se introducen datos en el &lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt; (objeto) y se hace click en un botón, se devuelve dicha información al &lt;span style="color: blue;"&gt;frame_principal&lt;/span&gt;, que lo muestra. Es decir, se introducen datos en un frame y los devuelve al frame maestro desde que fue instanciado (llamado). &lt;br /&gt;&lt;br /&gt;¿Cómo se ha hecho? La cuestión es que cuando se instancia el &lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt; en el &lt;span style="color: blue;"&gt;frame_principal&lt;/span&gt;, se le pasa como parámetro una referencia de él mismo. En &lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt; se crea un atributo (&lt;b&gt;&lt;span style="color: #274e13;"&gt;self.padre&lt;/span&gt;&lt;/b&gt;), que contiene la referencia al frame padre en donde fue creado.&lt;br /&gt;&lt;br /&gt;Este ejemplo se ha realizado en &lt;b&gt;Linux Ubuntu&lt;/b&gt; y el editor &lt;b&gt;joe&lt;/b&gt;. El código es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;# El viaje del navegante.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;# Ejemplo de paso de parámetros entre 2 frames en wxPython.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;# Importamos las wx&lt;/span&gt;&lt;br /&gt;import wx&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;# Creamos una clase frame que pide un dato.&lt;/span&gt;&lt;br /&gt;class &lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt;(wx.Frame):&lt;br /&gt;&amp;nbsp; def __init__(self, &lt;b style="color: #274e13;"&gt;parent&lt;/b&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Este es el constructor. Darse cuenta que se pasa como &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # parámetro parent, esto es, la referencia del frame que instancia&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # a esta clase. La guardamos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: #274e13;"&gt;self.padre = parent&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Llamamos al constructor de la clase de la que hereda.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.Frame.__init__(self, None, -1, title = "Introduce un valor")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos un sizer horizontal.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer = wx.BoxSizer( wx.HORIZONTAL )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos una caja de texto.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.caja_texto = wx.TextCtrl(self, -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos un botón.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton = wx.Button(self, -1,"ACEPTAR")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Añadimos al sizer la caja y el botón.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.caja_texto, 0, wx.ALL, 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton, 0, wx.ALL, 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #990000;"&gt; # Incluimos el sizer en el frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetSizer(sizer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos el binding. Cuando se haga click en el &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # botón se lanzará el manejador de eventos correspondiente.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton.Bind(wx.EVT_BUTTON, self.OnClickBoton)&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Manejador de eventos.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&amp;nbsp; def OnClickBoton(self, event):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Obtenemos datos de la caja de texto.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dato = self.caja_texto.GetValue()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Podríamos escribir directamente en el objeto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # que se desease.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: #274e13;"&gt;self.padre.caja_texto.SetValue(dato)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Nos vamos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.Destroy()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="color: #990000;"&gt;# Creamos la clase de la ventana principal.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;br /&gt;class &lt;span style="color: blue;"&gt;frame_principal&lt;/span&gt;(wx.Frame):&lt;br /&gt;&amp;nbsp; def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Constructor. Llamamos al constructor de la clase wx.Frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wx.Frame.__init__(self, None, -1, title = 'Ventana Principal')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos un sizer horizontal.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer = wx.BoxSizer( wx.HORIZONTAL )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos un botón.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton = wx.Button(self, -1, "Crear Frame Secundario")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos una caja de texto de solo lectura.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.caja_texto = wx.TextCtrl(self, -1, style = wx.TE_READONLY)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Añadimos al sizer la caja y el botón.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.boton, 0, wx.ALL, 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizer.Add(self.caja_texto, 0, wx.ALL, 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #990000;"&gt;&amp;nbsp; # Asociamos el sizer al frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.SetSizer(sizer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Creamos el binding. Cuando se haga click en el &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # botón se lanzará el manejador de eventos correspondiente.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.boton.Bind(wx.EVT_BUTTON, self.OnClickBoton)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Manejador de eventos.&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; def OnClickBoton(self, event):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Si se hace click se crea una instancia del frame_secundario.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; frame = frame_secundario&lt;b style="color: #274e13;"&gt;(self&lt;/b&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;# Mostramos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.Show()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="color: #990000;"&gt;# Creamos una aplicación wxPython.&lt;/span&gt;&lt;br /&gt;aplicacion = wx.PySimpleApp()&lt;br /&gt;&lt;span style="color: #990000;"&gt;# Instanciamos el frame principal.&lt;/span&gt;&lt;br /&gt;frame = frame_principal()&lt;br /&gt;&lt;span style="color: #990000;"&gt;# Y por supuesto, no olvidar mostrarlo.&lt;/span&gt;&lt;br /&gt;frame.Show()&lt;br /&gt;&lt;span style="color: #990000;"&gt;# Esperamos a capturar eventos.&lt;/span&gt;&lt;br /&gt;aplicacion.MainLoop()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;El código está muy comentado, pero volvemos a analizarlo. Se crea una aplicación &lt;b&gt;wxPython&lt;/b&gt;, que instancia la clase &lt;span style="color: blue;"&gt;frame_principal&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-0cExaBlaacs/TW1ZQreP4vI/AAAAAAAABPg/lKWBoRxnb5k/s1600/frame_principal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="https://lh3.googleusercontent.com/-0cExaBlaacs/TW1ZQreP4vI/AAAAAAAABPg/lKWBoRxnb5k/s320/frame_principal.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Si hacemos click en el botón "Crear Frame Secundario" se instancia la clase &lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt;, creando un segundo frame:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-XymMKpKV4Rk/TW1ZgiXPhyI/AAAAAAAABPk/VyKY9HRPz_k/s1600/frame_secundario.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh3.googleusercontent.com/-XymMKpKV4Rk/TW1ZgiXPhyI/AAAAAAAABPk/VyKY9HRPz_k/s320/frame_secundario.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Incluimos un texto en la caja de texto, &lt;b style="color: orange;"&gt;PYTHON!!!&lt;/b&gt;&lt;span style="color: black;"&gt;, y hacemos click en el botón Aceptar.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-jH0hUHjwcfY/TW1aJORX8mI/AAAAAAAABPo/3ZY8IoCHKYw/s1600/FRAME_SECUNDARIO2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh5.googleusercontent.com/-jH0hUHjwcfY/TW1aJORX8mI/AAAAAAAABPo/3ZY8IoCHKYw/s320/FRAME_SECUNDARIO2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;Tal como se aprecia en el código, se envía el dato al frame padre y se destruye la instancia del &lt;span style="color: blue;"&gt;frame_secundario&lt;/span&gt;.Y el resultado es:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-ZhfLoIhIrhA/TW1aOOB9hNI/AAAAAAAABPs/qU9a7KjD_Tw/s1600/FRAME_PRINCIPAL_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="https://lh3.googleusercontent.com/-ZhfLoIhIrhA/TW1aOOB9hNI/AAAAAAAABPs/qU9a7KjD_Tw/s320/FRAME_PRINCIPAL_2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;En el código se ha resaltado &lt;b&gt;&lt;span style="color: #274e13;"&gt;en verde&lt;/span&gt;&lt;/b&gt; el paso de la referencia del frame padre.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;Saludos.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1515544598944947522?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1515544598944947522/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/pasar-parametros-entre-frames-en.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1515544598944947522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1515544598944947522'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/03/pasar-parametros-entre-frames-en.html' title='Pasar parámetros entre frames en wxPython'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-0cExaBlaacs/TW1ZQreP4vI/AAAAAAAABPg/lKWBoRxnb5k/s72-c/frame_principal.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1365300586459813597</id><published>2011-02-25T12:19:00.000+01:00</published><updated>2011-02-25T12:19:45.716+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python en español'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='manual'/><title type='text'>Manual de introducción a Python, en español</title><content type='html'>Hola. Con motivo del taller sobre &lt;b&gt;Python&lt;/b&gt; en la &lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;Universidad de Murcia&lt;/b&gt;&lt;/span&gt; que se impartirá hoy, he creado un &lt;b&gt;manual de introducción a Python&lt;/b&gt;. No tiene ningún tipo de licencia, así que se puede copiar y modificar libremente. No es necesario mencionarme si lo modificáis.&lt;br /&gt;&lt;br /&gt;El documento se&amp;nbsp;encuentra en:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/documentacion"&gt;https://sites.google.com/site/elviajedelnavegante/documentacion&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hay muchos manuales de referencia, y en español los hay muy buenos (aunque pocos). Este manual no es tan bueno como aquellos, pero deja la puerta abierta para que el lector saboree las capacidades básicas de &lt;b&gt;Python&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Se han incluido 3 ejemplos (loterías, agenda, contar) en el documento, que se pueden descargar de:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/codigo"&gt;https://sites.google.com/site/elviajedelnavegante/codigo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Al ser una introducción dejo muchas cosas en el camino, así que espero podáis entenderlo.&lt;br /&gt;&lt;br /&gt;Saludos cordiales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1365300586459813597?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1365300586459813597/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/02/manual-de-introduccion-python-en.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1365300586459813597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1365300586459813597'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/02/manual-de-introduccion-python-en.html' title='Manual de introducción a Python, en español'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-2934916842780369786</id><published>2011-02-14T11:42:00.002+01:00</published><updated>2011-02-14T20:10:31.594+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferencia'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Curso de introducción a Python en la Universidad de Murcia</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Hola. Os comunico que el día &lt;b&gt;25 de Febrero&lt;/b&gt; realizaremos un &lt;b&gt;curso de introducción a&lt;/b&gt; &lt;b&gt;Python&lt;/b&gt;, en la &lt;b&gt;&lt;a href="http://www.um.es/"&gt;Universidad de Murcia&lt;/a&gt;&lt;/b&gt;. Toda la información la tenéis en el siguiente enlace:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://um.sym.posium.com/event_detail/434/detail/taller-caldum:-introduccion-al-lenguaje-de-programacion-python.html"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;http://um.sym.posium.com/event_detail/434/detail/taller-caldum:-introduccion-al-lenguaje-de-programacion-python.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;La charla durará unas 3 horas, y es una introducción al lenguaje, para empezar en el estupendo mundo de desarrollo de software. La impartirá &lt;i&gt;Antonio Mario Molina Saorín&lt;/i&gt; y &lt;i&gt;un servidor&lt;/i&gt;. Aquí os presento un descriptor de lo que queremos ver:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="font-family: Times, 'Times New Roman', serif; white-space: pre;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; white-space: normal;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;1) Lenguajes de programación.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;1.1) Tipos.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;1.2) Python.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;1.2.1) Historia.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;1.2.2) Características principales.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;2) Herramientas disponibles en Python&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;2.1) Editores, GUI's, IDE's.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;2.2) Frameworks.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;2.3) Módulos.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;4) Introducción al lenguaje.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;4.1) Intérprete de Python.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;4.2) Hola mundo: print y raw_input.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;4.3) Tipos de datos: números, booleanos, listas, tuplas, t.hashing, ficheros.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;4.4) Estructuras de control de flujo (if, for, while).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;4.5) Ficheros .py, pyc, pyw y pyo.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  5&lt;/span&gt;) Scripts en Python.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  6&lt;/span&gt;) Módulos más utilizados (os, datetime, sys) y namespaces en Python.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  7&lt;/span&gt;) POO en Python.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   7&lt;/span&gt;.1) Clases y objetos.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   7&lt;/span&gt;.2) Herencia, polimorfismo, encapsulación, abstracción.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  8&lt;/span&gt;) cPickle: persistencia de objetos.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  9&lt;/span&gt;) Recursos en Internet (sheets, cards).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;10) Creación de una agenda personal, en Python.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;11) Aplicaciones gráficas: wxPython/Tkinter.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;12) Propuestas para nuevos talleres Python.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;13) Preguntas.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;En unas 3 horas te haces con el lenguaje básico, si te lo comentan mejor que si lo haces solo.&amp;nbsp;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Si no sabéis nada de&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;b&gt; Python&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt; y sí de programación, os sorprenderá este lenguaje, por lo sumamente sencillo de aprender y la sintaxis tan clara que tiene. Una vez que lo pruebas, de verdad que se hace muy difícil desengancharse. Se pueden hacer cosas muy rápidas y sencillas, ya que &lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt; es un lenguaje de muy alto nivel (gran nivel de abstracción).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: Times, 'Times New Roman', serif;"&gt;Aquíi tenéis el lugar en donde se impartirá:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;object data="http://um.sym.posium.com/event_detail/simple/434" height="400" type="text/html" width="600"&gt;&lt;a href="http://um.sym.posium.com/event_detail/simple/434"&gt;link&lt;/a&gt;&lt;/object&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: Times, 'Times New Roman', serif;"&gt;Saludos.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-2934916842780369786?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/2934916842780369786/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/02/curso-de-introduccion-python-en-la.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/2934916842780369786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/2934916842780369786'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/02/curso-de-introduccion-python-en-la.html' title='Curso de introducción a Python en la Universidad de Murcia'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-3843501999428313471</id><published>2011-01-27T21:00:00.000+01:00</published><updated>2011-01-27T21:00:58.988+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cPickle'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><title type='text'>Persistencia de imágenes con Python: SQLServer y cPickle</title><content type='html'>Hola. En este artículo vamos a ver cómo guardar y recuperar imágenes de una base de datos &lt;b&gt;Microsoft SQLServer 2005 Express Edition&lt;/b&gt;, con &lt;b&gt;Python&lt;/b&gt;, así como guardar y recuperar también, imágenes, en un objeto que se &lt;i&gt;serializa&lt;/i&gt;, guardando dicha información en disco, mediante &lt;b&gt;cPickle&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Antes de nada comentar que en este&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt; blog&lt;/span&gt;&lt;/b&gt; se han tratado varios tipos de &lt;b&gt;SGBD&lt;/b&gt;, tales como &lt;b&gt;MySQL&lt;/b&gt;, &lt;b&gt;Firebird&lt;/b&gt;, &amp;nbsp;ó&amp;nbsp;&lt;b&gt;SQLServer 2008&lt;/b&gt;. El elegir &lt;b&gt;SQLServer 2005 Express Edition&lt;/b&gt; es simplemente para probar que &lt;b&gt;Python&lt;/b&gt; funciona, mediante &lt;b&gt;pyodbc&lt;/b&gt;, con la mayoría de los sistemas gestores de bases de datos actuales. Y para ver si funciona lo mejor es probarlo uno mismo, ya que &lt;i&gt;no es lo mismo conocer el camino que andar el camino&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTA&lt;/b&gt;: Este &lt;i&gt;post &lt;/i&gt;lo he escrito en la plataforma &lt;b&gt;Microsoft Windows XP SP3,&lt;/b&gt; con &lt;b&gt;Python 2.6.6&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Imágenes en SQLServer 2005 con Python&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Lo primero de todo es descargar el SGBD &lt;b&gt;Microsoft SQLServer 2005 Express Edition&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGWbvr7AzI/AAAAAAAABOs/_Ee_97_eFoA/s1600/sqlserver2005_0.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGWbvr7AzI/AAAAAAAABOs/_Ee_97_eFoA/s320/sqlserver2005_0.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Se puede hacer desde aquí:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=220549b5-0b07-4448-8848-dcc397514b41&amp;amp;displayLang=es"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=220549b5-0b07-4448-8848-dcc397514b41&amp;amp;displayLang=es&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;También (recomendable) es posible descargarse el&amp;nbsp;&lt;b&gt;Microsoft SQL Server Management Studio Express&lt;/b&gt;, el cual es un entorno gráfico para gestionar las bases de datos que vayamos creando, de la siguiente &lt;b&gt;URL&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796#filelist"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796#filelist&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Instalamos los dos paquetes de software....&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TUGW2kYMJWI/AAAAAAAABO0/ws8LrLc0iGM/s1600/sqlserver2005_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TUGW2kYMJWI/AAAAAAAABO0/ws8LrLc0iGM/s1600/sqlserver2005_1.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Una vez instalado, nos vamos al &lt;b&gt;Management Studio&lt;/b&gt; y creamos una base de datos, llamada &lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;imagenes&lt;/b&gt;&lt;/span&gt;, con una tabla, llamada &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;registro&lt;/b&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TUGW4J4TnlI/AAAAAAAABO8/UjlmamYZ1aI/s1600/sqlserver2005_3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="470" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TUGW4J4TnlI/AAAAAAAABO8/UjlmamYZ1aI/s640/sqlserver2005_3.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TUGW2AcoudI/AAAAAAAABOw/b9ZnQe0WoY4/s1600/sqlserver2005_4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="353" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TUGW2AcoudI/AAAAAAAABOw/b9ZnQe0WoY4/s640/sqlserver2005_4.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Como podemos observar, se crea una tabla con tres campos, un &lt;b&gt;int&lt;/b&gt;, un &lt;b&gt;nvarchar&lt;/b&gt; y un tipo &lt;b&gt;image&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGZdqVYSlI/AAAAAAAABPA/zO3UMq_JSIQ/s1600/sqlserver2005_pyodbc.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGZdqVYSlI/AAAAAAAABPA/zO3UMq_JSIQ/s1600/sqlserver2005_pyodbc.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;Una vez tenemos instalado &lt;b&gt;SQLServer 2005&lt;/b&gt;, con nuestra base de datos y nuestra tabla, vamos a instalar &lt;b&gt;pyodbc&lt;/b&gt;, el software de&amp;nbsp;&lt;b&gt;Python&lt;/b&gt; para crear conexiones &lt;b&gt;ODBC &lt;/b&gt;a orígenes de datos, en este caso, el software de &lt;b&gt;Microsoft&lt;/b&gt;. Para ello, descargamos el &lt;b&gt;pyodbc&lt;/b&gt;, desde&amp;nbsp;&lt;a href="http://code.google.com/p/pyodbc/"&gt;http://code.google.com/p/pyodbc/&lt;/a&gt;. Creamos a continuación, mediante las &lt;i&gt;Herramientas Administrativas/Orígenes de datos (ODBC)&lt;/i&gt;, nuestra conexión:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TUGaM9DkanI/AAAAAAAABPE/bHX9EFT6u8A/s1600/sqlserver2005_pyodbc2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TUGaM9DkanI/AAAAAAAABPE/bHX9EFT6u8A/s640/sqlserver2005_pyodbc2.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;NOTA&lt;/b&gt;: El lector debe de tener en cuenta que existe un módulo específico para la conexión de &lt;b&gt;SQLServer &lt;/b&gt;con&amp;nbsp;&lt;b&gt;Python&lt;/b&gt;, llamado &lt;b&gt;pymssql&lt;/b&gt;, que se puede obtener de&amp;nbsp;&lt;a href="http://code.google.com/p/pymssql/"&gt;http://code.google.com/p/pymssql/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTA 2&lt;/b&gt;: Pudiera ser que con &lt;b&gt;SQLServer 2005 Express Edition &lt;/b&gt;aparezcan ciertos errores a la hora de crear la conexión &lt;b&gt;ODBC&lt;/b&gt; referidos a la&amp;nbsp;configuración del mismo, con el&lt;i&gt; propósito de permitir conexiones remotas&lt;/i&gt;. Bien, la solución la tenéis aquí:&amp;nbsp;&lt;a href="http://support.microsoft.com/kb/914277/es"&gt;http://support.microsoft.com/kb/914277/es&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una vez creado el &lt;b&gt;ODBC&lt;/b&gt;&amp;nbsp;y la conexión correctamente realizada, ya tenemos todo listo para programar en &lt;b&gt;Python&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;El código para &lt;u&gt;crear una conexión&lt;/u&gt; desde &lt;b&gt;Python&lt;/b&gt; a &lt;b&gt;SQLServer 2005&lt;/b&gt;, mediante &lt;b&gt;pyodbc&lt;/b&gt;, podría ser tal que así:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import pyodbc&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Cadena de conexión.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;cadenaConexion = 'DSN=imagenes;UID=ABUSIMBEL\familia'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;try:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;conexionSQLServer = pyodbc.connect(cadenaConexion)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cursorSQLServer = conexionSQLServer.cursor()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Conectado con SQLServer 2005 Express!"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;except:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "No he podido conectar con base de datos SQLServer!"&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Cerramos cursor y conexión.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;print "Cerrando conexiones!"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;cursorSQLServer.close()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;conexionSQLServer.close()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si todo ha ido bien, debe de aparecer algo como esto:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Conectado con SQLServer 2005 Express!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Cerrando conexiones!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;A continuación vamos a insertar una imagen en la tabla &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;registro &lt;/b&gt;&lt;/span&gt;de la base de datos &lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;imagenes&lt;/b&gt;&lt;/span&gt;. El código podría ser tal que así:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import os&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_imagen = os.path.realpath('alvaro.jpg')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;imagen = open(fichero_imagen,'rb').read()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cargamos un fichero &lt;b&gt;jpg&lt;/b&gt;, y lo referenciamos mediante imagen. Se supone que el fichero ha de existir. El código para insertar una imagen en la base de datos es el siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Cadena SQL a ejecutar.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;cadenaSQL = "insert into registro values (1,'alvaro',?)"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Lanzamos Sentencia.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;cursorSQLServer.execute(cadenaSQL, (pyodbc.Binary(imagen),))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Confirmamos escritura.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;conexionSQLServer.commit()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cabe destacar que transformamos en binario la imagen cargada del fichero. Además hacemos &lt;b&gt;commit&lt;/b&gt;, no olvidarlo. Si nos vamos al &lt;b&gt;Management Studio&lt;/b&gt; y hacemos una consulta a la tabla tenemos la solución:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGhTi4rp9I/AAAAAAAABPM/y4ZhmpijRuE/s1600/sqlserver2005_100.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="336" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGhTi4rp9I/AAAAAAAABPM/y4ZhmpijRuE/s640/sqlserver2005_100.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bien, ya sabemos como insertar imágenes en la base de datos. Ahora toca como recuperar la información, mediante el &lt;b&gt;select&lt;/b&gt; correspondiente. El código para hacer esto podría parecerse a lo siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Creamos el nombre de un fichero destino.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_destino = os.path.realpath('destino.jpg')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Lanzamos la consulta de selección SQL.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;imagen = cursorSQLServer.execute('SELECT * FROM registro WHERE id = 1')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Creamos un fichero de destino (temporal).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_final = open(fichero_destino,'wb')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Escribimos en el fichero y lo cerramos.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_final.write(imagen.next()[2])&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_final.close()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cabe destacar que se crea un fichero de salida temporal (destino.jpg) para obtener en disco el fichero seleccionado de la base de datos. También decir que utilizamos next() para iterar sobre el cursor y obtener la imagen, que se encuentra en la posición 3 de la tupla (es decir, imagen.next()[2]), ya que la tabla tiene 3 campos y el campo imagen es el tercero.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Decir que si se quiere que se vea automáticamente la imagen recuperada, se puede utilizar:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_destino = os.path.realpath('destino.jpg')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;os.startfile(fichero_destino)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En mi sistema &lt;b&gt;Windows&lt;/b&gt;, automáticamente se abre el programa asociado a ficheros de imágenes, &lt;i&gt;Visor de imágenes y faz de Windows&lt;/i&gt;, dando como resultado:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TUGk83AgJYI/AAAAAAAABPQ/bqAonuxs0Vw/s1600/sqlserver2005_200.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="432" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TUGk83AgJYI/AAAAAAAABPQ/bqAonuxs0Vw/s640/sqlserver2005_200.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Imágenes serializadas en objetos con Python&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bien. Estamos en la segunda parte del post. Ahora lo que vamos a hacer es guardar una imagen dentro de un objeto y dicho objeto guardarlo en disco. Sería así como un wrapper de la imagen que se guardará en disco. Lo bueno que tiene esto es que se pueden guardar múltiples imágenes en cualquier tipo de contenedor (lista, tupla, diccionario) y guardarla directamente en disco, a capón. Para ello vamos a crear primero una clase, llamada persistencia, que tendrá la funcionalidad de cargar y guardar un objeto.&lt;br /&gt;&lt;br /&gt;El código que define la &lt;b&gt;clase persistencia &lt;/b&gt;es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import cPickle&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;class persistencia(object):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def nombre_clase(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str(self).split(' ')[0].split('.')[1]&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def cargar(self, nombre_fichero = None):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if nombre_fichero is None:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nombre_fichero = self.nombre_clase()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;manejador_fichero = open(nombre_fichero,'r')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;objeto = cPickle.load(manejador_fichero)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;manejador_fichero.close()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return objeto&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def salvar(self, objeto, nombre_fichero = None):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if nombre_fichero is None:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nombre_fichero = self.nombre_clase()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Fichero que contendrÃ¡ el objeto.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;manejador_fichero = open(nombre_fichero,'w')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Volcamos el objeto de memoria al fichero.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cPickle.dump(self, manejador_fichero)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Cerramos fichero.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;manejador_fichero.close()&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ahora, únicamente hay que crear una clase que herede de &lt;b&gt;persistencia&lt;/b&gt;, para obtener su funcionalidad, e implementar las estructuras necesarias para guardar imágenes. Para ello implementamos la &lt;b&gt;clase registro&lt;/b&gt;, tal que así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;class registro(persistencia):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._registro = []&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def insertar_persona(self, nombre, foto):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._registro.append([nombre, foto])&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def devolver_persona(self, nombre = None):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if nombre is None:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self._registro&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for i in self._registro:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if i[0] == nombre:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return i&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora falta, por fin, utilizar las clases que hemos diseñado, para poder ver que efectivamente funciona la idea. El código para &lt;i&gt;serializar&lt;/i&gt; una imagen en un objeto podría tener el siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import os&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Cargamos imagen.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_imagen = os.path.realpath('alvaro.jpg')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;imagen = open(fichero_imagen,'rb').read()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Instanciamos la clase que contendrá el registro de personas.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;personas = registro()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;personas.insertar_persona('alvaro',imagen)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;personas.salvar(personas)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como podemos observar la funcionalidad heredada nos permite guardar la imagen en un fichero, mediante la &lt;i&gt;serialización del objeto&lt;/i&gt;. Decir que hemos incluido una imagen únicamente. Podríamos incluir tantas imágenes como quisiéramos. Evidentemente se crea un fichero, llamado &lt;b&gt;registro&lt;/b&gt;, el cual tiene el siguiente contenido:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TUHDXoCCD0I/AAAAAAAABPU/zTFv93BdneE/s1600/registro_persistencia.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TUHDXoCCD0I/AAAAAAAABPU/zTFv93BdneE/s640/registro_persistencia.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El formato del fichero nos da igual. Lo importante es que podamos recuperar la información guardada en las estructuras de datos de alto nivel que dispone &lt;b&gt;Python&lt;/b&gt;. Vamos por último a ver cómo recuperar la información guardada en el &lt;b&gt;objeto serializado&lt;/b&gt;. Podríamos utilizar un código como este:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import os&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Obtenemos datos.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;personas = registro()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;personas = personas.cargar()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;individuo = personas.devolver_persona('alvaro')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Creamos fichero.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;fichero_destino = os.path.realpath('destino.jpg')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;imagen = open(fichero_destino,'wb')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;imagen.write(individuo[1])&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;imagen.close()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;# Y lo mostramos por pantalla, para ver que efectivamente funciona la idea.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;os.startfile(fichero_destino)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esto es todo por el momento. Saludos.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-3843501999428313471?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/3843501999428313471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/01/persistencia-de-imagenes-con-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/3843501999428313471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/3843501999428313471'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/01/persistencia-de-imagenes-con-python.html' title='Persistencia de imágenes con Python: SQLServer y cPickle'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y_bGxMwbE9g/TUGWbvr7AzI/AAAAAAAABOs/_Ee_97_eFoA/s72-c/sqlserver2005_0.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-3100256550999163673</id><published>2011-01-09T14:07:00.005+01:00</published><updated>2011-01-09T14:59:57.373+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejercicios'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Ejercicios resueltos de programación, en Python y en español, I.</title><content type='html'>Hola. Este es el primero de la serie de artículos que presentaré estos días sobre una colección de ejercicios muy &amp;nbsp;básicos de programación, para resolver con &lt;b&gt;Python&lt;/b&gt; (o cualquier otro lenguaje). Decir que son muy sencillos y sirven para afianzar conocimientos básicos de sintaxis y razonamiento. Si eres novel en &lt;b&gt;programación&lt;/b&gt; ó en &lt;b&gt;Python&lt;/b&gt;, este post es para tí. De lo contrario, te resultarán triviales los planteamientos expuestos.&lt;br /&gt;&lt;br /&gt;Los enunciados los he obtenido del libro &lt;b&gt;Esquemas Algorítmicos Fundamentales - Secuencias e Iteración&lt;/b&gt;, de &lt;b&gt;P.C. Scholl&lt;/b&gt; y &lt;b&gt;J.P. Peyrin&lt;/b&gt;, editorial &lt;b&gt;Masson.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;u&gt;Ejercicio 1.&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir un algoritmo que, para cualquier número de segundos inferior a un&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;millón, calcule su equivalente en días, horas, minutos y segundos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este ejercicio tenemos que tener en cuenta que:&lt;br /&gt;&lt;br /&gt;1 minuto = 60 segundos.&lt;br /&gt;1 hora = 60 minutos = 3600 segundos.&lt;br /&gt;1 dia = 24 horas = 1440 minutos = 86400 segundos.&lt;br /&gt;&lt;br /&gt;# Pedimos datos.&lt;br /&gt;dato = raw_input(u'Número de segundos: ')&lt;br /&gt;&lt;br /&gt;# Hacemos un cast, convirtiendo la cadena en un número largo.&lt;br /&gt;dato = long(dato)&lt;br /&gt;&lt;br /&gt;# Comprobamos si el número introducido es menor a un millón.&lt;br /&gt;if dato &amp;gt;= 1000000:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "El número debe de ser menor a 1000000"&lt;br /&gt;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Días.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ndias, aux = divmod(dato, 86400)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Horas.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;nhoras, aux = divmod(aux, 3600)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Minutos y segundos.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;nmin, nseg = divmod(aux, 60)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Mostramos resultado.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print '%d días, %d horas, %d minutos, %d segundos' % \&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(ndias, nhoras, nmin, nseg)&lt;br /&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;/div&gt;&lt;div style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 2.&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: #990000;"&gt;Escribir un algoritmo que imprima el mínimo, el máximo y la media de&amp;nbsp;tres números.&lt;/div&gt;&lt;br /&gt;# Obtenemos números.&lt;br /&gt;numeros = []&lt;br /&gt;for i in ['primer', 'segundo','tercer']:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;texto = u'Introduce el %s número: ' % (i)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;numeros.append(float(raw_input(texto)))&lt;br /&gt;&lt;br /&gt;# Ordenamos.&lt;br /&gt;numeros.sort()&lt;br /&gt;&lt;br /&gt;# Obtenemos máximo y mínimo.&lt;br /&gt;minimo = numeros[0]&lt;br /&gt;maximo = numeros[2]&lt;br /&gt;&lt;br /&gt;# Obtenemos la media aritmética.&lt;br /&gt;media = round((numeros[0] + numeros[1] + numeros[2]) / float(3),3)&lt;br /&gt;&lt;br /&gt;# Visualizamos resultados.&lt;br /&gt;cadena = u'Mínimo: %d, Máximo: %d, Media: %f' % (minimo, maximo, media)&lt;br /&gt;print cadena&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 3.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir un algoritmo que, dado el infinitivo de un verbo regular de la&amp;nbsp;primera conjugación, obtenga la conjugación en singular y plural de presente de&amp;nbsp;indicativo. Por ejemplo, para el verbo cantar el resultado es yo canto,&amp;nbsp;tu cantas, el canta, nosotros cantamos, vosotros cantáis, ellos cantan.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;pronombre = ['yo','tu','el','nosotros','vosotros','ellos']&lt;br /&gt;&lt;br /&gt;terminaciones = {'yo':'o',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'tu':'as',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'el':'a',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'nosotros':'amos',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'vosotros':u'áis',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'ellos':'an'}&lt;br /&gt;&lt;br /&gt;# Pedimos datos.&lt;br /&gt;palabra = raw_input(u'Verbo regular 1ra. conjugación: ')&lt;br /&gt;&lt;br /&gt;# Recorremos la tabla hashing (diccionario), construyendo la conjugación verbal.&lt;br /&gt;for i in pronombre:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print i, palabra[0:len(palabra)-2] + terminaciones[i]&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 4.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir un algoritmo que, para un número binario de 4 cifras, imprima su valor&amp;nbsp;en base 10. Se estudiarán dos formas del problema según la representación de&amp;nbsp;los datos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;-forma 1: los datos son cuatro enteros (0 ó 1). Por ejemplo: 1,1,0,1.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;-forma 2: el dato es un entero cuya representación decimal con cuatro&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cifras no contenga más que 0 ó 1: Por ejemplo: 1101.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;# Obtenemos datos.&lt;br /&gt;nbinario = raw_input(u'Número binario (4 cifras): ')&lt;br /&gt;&lt;br /&gt;# Obtenemos los dígitos.&lt;br /&gt;nbinario = nbinario.split(',')&lt;br /&gt;if len(nbinario) == 1: nbinario = list(nbinario[0])&lt;br /&gt;&lt;br /&gt;# Inicializamos algunos contadores.&lt;br /&gt;decimal = 0&lt;br /&gt;potencia = 0&lt;br /&gt;&lt;br /&gt;# Le damos la vuelta al número binario.&lt;br /&gt;nbinario.reverse()&lt;br /&gt;&lt;br /&gt;# Calculamos el número decimal, a partir del número binario.&lt;br /&gt;for i in nbinario:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;decimal += pow(2,potencia) if i == '1' else 0&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;potencia += 1&lt;br /&gt;&lt;br /&gt;# Visualizamos resultado.&lt;br /&gt;cadena = u'Su representación decimal es %d' % (decimal)&lt;br /&gt;print cadena&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 5.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir un algoritmo que decodifique fechas del siglo XXI. El dato es un&amp;nbsp;entero comprendido entre 10100 y 311299. El resultado es una secuencia de&amp;nbsp;caracteres: número del día dentro del mes, del mes dentro del año y del año&amp;nbsp;dentro del siglo. Por ejemplo, para el dato 30485, el resultado es el texto&amp;nbsp;3-4-2085.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;# Obtenemos dato.&lt;br /&gt;dato = raw_input('Introduce dato: ')&lt;br /&gt;&lt;br /&gt;# Decodificamos año dentro del siglo XXI.&lt;br /&gt;anyo = 2000 + int(dato[len(dato)-2:])&lt;br /&gt;&lt;br /&gt;# Decodificamos mes.&lt;br /&gt;mes = int(dato[len(dato)-4:len(dato)-2])&lt;br /&gt;&lt;br /&gt;# Decodificamos día.&lt;br /&gt;dia = int(dato[:len(dato)-4])&lt;br /&gt;&lt;br /&gt;# Mostramos resultado.&lt;br /&gt;cadena = '%d-%d-%d' % (dia, mes, anyo)&lt;br /&gt;print cadena&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 6.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir un algoritmo que, para una suma de dinero dada, indique cómo&amp;nbsp;descomponerla en billetes y monedas corrientes. Se desea utilizar el mínimo&amp;nbsp;de billetes y monedas. No hay ninguna limitación respecto al número de billetes&amp;nbsp;y monedas disponibles.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;# Declaramos datos básicos (euros) con los que trabajar.&lt;br /&gt;billetes_y_monedas = [500,200,100,50,20,10,5, 2, 1, 0.50, 0.20, 0.10,&lt;br /&gt;0.05, 0.02, 0.01]&lt;br /&gt;&lt;br /&gt;# Creamos un monedero, donde meter el dinero.&lt;br /&gt;monedero = []&lt;br /&gt;&lt;br /&gt;# Pedimos la cantidad.&lt;br /&gt;dato = raw_input(u'Introducir importe (euros): ')&lt;br /&gt;&lt;br /&gt;# Buscamos parte decimal y entera.&lt;br /&gt;dato = dato.split('.')&lt;br /&gt;&lt;br /&gt;# Decimal...&lt;br /&gt;try: parte_decimal = float('0.'+dato[1])&lt;br /&gt;except: parte_decimal = 0.0&lt;br /&gt;&lt;br /&gt;# Entera...&lt;br /&gt;parte_entera = long(dato[0])&lt;br /&gt;&lt;br /&gt;# Algoritmo de asignación de dinero.&lt;br /&gt;for i in billetes_y_monedas:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Obtenemos número de billetes ó monedas y los guardamos.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unidades, resto = divmod(parte_entera, i)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if unidades != 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;monedero.append((i,unidades))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Asignamos lo que nos queda.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parte_entera = resto&lt;br /&gt;&lt;br /&gt;if parte_decimal &amp;gt; 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for i in billetes_y_monedas:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Obtenemos número de monedas y los guardamos.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unidades, resto = divmod(parte_decimal, i)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if unidades != 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;monedero.append((i,unidades))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Asignamos lo que nos queda.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parte_decimal = round(resto,2)&lt;br /&gt;&lt;br /&gt;# Visualizamos el resultado.&lt;br /&gt;cadena = ''&lt;br /&gt;for i in monedero:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if i[0] &amp;gt;= 5: cadena += '%d billete/s de %d euros' % (i[1],i[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if i[0] &amp;lt; 5: cadena += '%d moneda/s de %s euros' % (i[1],i[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cadena += '\n'&lt;br /&gt;print cadena&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 7.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir un algoritmo que simule el funcionamiento de una calculadora. El dato&amp;nbsp;es una serie de tres caracteres: una cifra, un símbolo de operación y otra&amp;nbsp;cifra. El resultado es el valor de la expresión dada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Pedimos datos.&lt;br /&gt;dato = raw_input(u'Introduce operación: ')&lt;br /&gt;&lt;br /&gt;# Inicializamos resultado.&lt;br /&gt;resultado = 0&lt;br /&gt;&lt;br /&gt;# ¿Suma?&lt;br /&gt;serie = dato.split('+')&lt;br /&gt;if len(serie) == 2: resultado = long(serie[0]) + long(serie[1])&lt;br /&gt;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# ¿Resta?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;serie = dato.split('-')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if len(serie) == 2: resultado = long(serie[0]) - long(serie[1])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# ¿Multiplicación?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serie = dato.split('*')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if len(serie) == 2: resultado = long(serie[0]) * long(serie[1])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# ¿División?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serie = dato.split('/')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if len(serie) == 2: resultado = long(serie[0]) / long(serie[1])&lt;br /&gt;&lt;br /&gt;# Mostramos resultado.&lt;br /&gt;print "El resultado es",resultado&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 8.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Consideremos una hora expresada en forma de tripleta &lt;hora, minutos,="" segundos=""&gt;.&amp;nbsp;Escribir un algoritmo que imprima la hora correspondiente al siguiente segundo.&amp;nbsp;Por ejemplo, para la entrada 13,43,24 tiene que devolver 13,43,25.&lt;/hora,&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se supone que lo que introducimos es una hora correcta. Darse cuenta que no se chequean los datos introducidos, por cuestión de simplicidad.&lt;br /&gt;&lt;br /&gt;# Pedimos datos.&lt;br /&gt;tiempo = raw_input('Introduce tiempo: ')&lt;br /&gt;&lt;br /&gt;# Obtenemos datos.&lt;br /&gt;aux = tiempo.split(',')&lt;br /&gt;horas = int(aux[0])&lt;br /&gt;minutos = int(aux[1])&lt;br /&gt;segundos = int(aux[2])&lt;br /&gt;&lt;br /&gt;# Aumentamos un segundo.&lt;br /&gt;segundos += 1&lt;br /&gt;&lt;br /&gt;# Casos.&lt;br /&gt;if segundos != 60:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;tiempo = (horas, minutos, segundos)&lt;br /&gt;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if minutos == 59 and horas == 23:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tiempo = (0, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if minutos == 59:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tiempo = (horas + 1, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tiempo = (horas, minutos + 1, 0)&lt;br /&gt;&lt;br /&gt;# E imprimimos resultado (una tupla).&lt;br /&gt;print tiempo&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 9.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir una función que determine si una letra dada es consonante.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A la función le faltaría controlar las letras con acentuación (tildes, diéresis, etc).&lt;br /&gt;&lt;br /&gt;def es_consonante(letra):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if letra.lower() not in ['a','e','i','o','u']:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return False&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;u&gt;Ejercicio 10.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Escribir una función que calcule el factorial de un número. Por ejemplo, 5! = 5*4*3*2*1 = 120.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;def factorial(numero):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 1 if numero &amp;lt;=0 else numero * factorial(numero -1)&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-3100256550999163673?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/3100256550999163673/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/01/ejercicios-de-programacion-en-python-y.html#comment-form' title='30 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/3100256550999163673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/3100256550999163673'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/01/ejercicios-de-programacion-en-python-y.html' title='Ejercicios resueltos de programación, en Python y en español, I.'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1209529393144772615</id><published>2011-01-01T12:09:00.004+01:00</published><updated>2011-01-04T10:49:25.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trabajo'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python, de programadores para programadores</title><content type='html'>&lt;div style="text-align: justify;"&gt;Yo no soy un programador web, aunque tenga idea, ni soy diseñador web, que no tengo idea. Pero si soy desarrollador de software desde hace algunos años.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Python&lt;/b&gt; es &lt;strike&gt;framework&lt;strike&gt;&lt;/strike&gt;&lt;/strike&gt; un lenguaje de programacion de desarrollo multidimensional, esto es, sirve tanto para crear scripts de mantenimiento de sistemas (Windows, Unix, Mac), como creación de aplicaciones para móviles (Android, Symbian), aplicaciones gráficas de escritorio (&lt;b&gt;wxPython&lt;/b&gt;, Qt, GTK, Tkinter), desarrollo web (&lt;b&gt;Django&lt;/b&gt;, web2py, TurboGears, …).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el mercado de desarrollo de software hay cantidad de productos, tales como&amp;nbsp;PHP para programación web, y frameworks como Symfony, muy potentes, y todo lo hacen con MVC, como debería ser.&amp;nbsp;Al igual que &amp;nbsp;está C++, que es el mejor lenguaje de programación, referido en cuestiones de potencia y flexibilidad, y el más difícil de aprender para mi.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Evidentemente, cada problemática tiene una solución, y cada lenguaje aporta ciertas características técnicas que lo hacen ideal para la solución propuesta.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ahora bien, como lenguaje general, con aportes a web y demás,&lt;b&gt; Python&lt;/b&gt; es uno de los lenguajes de programación más completos, que se diferencia en ciertos aspectos a otros lenguajes del mercado, y que algunas personas tenemos muy en cuenta, a saber:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1) Sintaxis fácil de aprender.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2) POO integrada desde sus inicios.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3) Multiparadigma y multiplataforma.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;4) Dinámico, fuertemente tipado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;5) Multidimensional (referido a su campo de aplicación).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;6) Ampliamente documentado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;7) Proyecto vivo (multitud de módulos, packages).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;8) Respaldado por empresas grandes (Google, etc.).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esta afirmación que hago es muy personal. Cuando se apuesta por un lenguaje como &lt;b&gt;Python&lt;/b&gt; (y más en España, donde apenas existen programadores en comparación con otros países, como Argentina), significa varias cosas. Primero, que posiblemente la persona que se inicia en esta andadura ya haya visto muchas cosas en su vida (lenguajes), y &lt;i&gt;necesita hacer las cosas bien&lt;/i&gt;. Segundo, los tiempos de desarrollo se acortan (y no me refiero a que un framework lleve CRUD incorporado), tanto para cualquier script como aplicación de la naturaleza que sea. Esto es debido a que es un lenguaje de muy alto nivel (de abstracción): lenguaje dinámico y estructuras de alto nivel, como listas y tablas hashing (también llamadas diccionarios).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Yo he trabajado con herrramientas de Microsoft (Visual Basic 6) y Sybase (PowerBuilder). No se mucho de desarrollo de software, es más, cada día que pasa y leo y leo sé que sé menos…&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;…pero al esforzarme por hacer las cosas bien, veo que&lt;b&gt; Python&lt;/b&gt; me ayuda… y un lenguaje que implementa ciertos paradigmas de programación como POO tan fácilmente, ó en donde los bloques de código se escriben con tanta naturalidad (y esta palabra es muy importante en el desarrollo de software)… no se… da que pensar…&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;…y es que la legibilidad cuenta, que ya vendrán otros a mantener tu software, y deben saber lo que has hecho.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Yo he sido muy fanático de PowerBuilder, para gestión empresarial, donde sinceramente digo que no hay actualmente herramientas más potentes que los DataWindows para acceso a datos. Sin embargo, PB se ha hecho más complicado con el tiempo. Desde la versión 6 (la mejor) hasta la 12 (la más complicada), ha pasado mucho. Y yo necesitaba mejorar como desarrollador de software. &lt;b&gt;Python&lt;/b&gt; hace mejor al desarrollador, ya que ayuda a escribir mejor, esto es, a escribir menos, para hacer lo mismo, lo que indica recortar tiempos de desarrollo, y en definitiva, acortar proyectos, lo que implica a su vez, dinero.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pero la verdad, la realidad, es muy distinta. En España por lo menos. &lt;b&gt;Python&lt;/b&gt; se utiliza muy poco, PHP lo que más, junto a las herramientas de Microsoft y Java.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Después de llevar con &lt;b&gt;Python&lt;/b&gt; un año, de escribir en este blog por puro amor al arte, me niego a emprender otra andadura diferente en la que estoy. Creo firmemente que apostar por&lt;b&gt; Python&lt;/b&gt; y sucedáneos, tales como &lt;b&gt;Django&lt;/b&gt; para web, &lt;b&gt;wxPython&lt;/b&gt; para escritorio, &lt;b&gt;Plone&lt;/b&gt; para CMS, etcétera, es una apuesta a &lt;span class="Apple-style-span" style="color: #990000;"&gt;caballo ganador&lt;/span&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Las distancias hoy día no son barreras para asociarse y trabajar juntos, para eso está &lt;span class="Apple-style-span" style="color: #990000;"&gt;Internet&lt;/span&gt;...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;u&gt;Si eres una persona responsable, muy comprometida, que quiere embarcarse en algo diferente, apostar por el talento, el esfuerzo y hacer las cosas de la forma correcta, aquí espero para que hablemos.&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Resumiendo, &lt;b&gt;Python&lt;/b&gt;, siempre desde mi punto de vista, es un &lt;s&gt;framework&lt;/s&gt;&amp;nbsp;lenguaje de programación de desarrollo,&lt;span class="Apple-style-span" style="color: #990000;"&gt; de programadores para programadores&lt;/span&gt;, donde prima el hacer las cosas de la manera correcta, en el menor tiempo posible (¡y en este orden!).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1209529393144772615?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1209529393144772615/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/01/python-de-programadores-para.html#comment-form' title='15 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1209529393144772615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1209529393144772615'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2011/01/python-de-programadores-para.html' title='Python, de programadores para programadores'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-6251419637011719047</id><published>2010-12-23T23:44:00.001+01:00</published><updated>2010-12-26T12:48:21.625+01:00</updated><title type='text'>wxPython: Crear un editor simple, en Python</title><content type='html'>Hola. En este post os presento un editor de texto básico escrito en &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;, para que veáis el funcionamiento, cómo se heredan clases de las &lt;b&gt;wx&lt;/b&gt;, así como el uso de la impresión en &lt;b&gt;wxPython&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;El código, como siempre, se puede descargar del repositorio de este blog, en:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/codigo"&gt;https://sites.google.com/site/elviajedelnavegante/codigo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fichero &lt;b&gt;editor_ejemplo.zip&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Estamos hablando de un editor de texto, no de un procesador de texto, por tanto no podemos incluir texto enriquecido ni nada parecido. Es lo más parecido al &lt;i&gt;bloc de notas&lt;/i&gt; de &lt;b&gt;Windows&lt;/b&gt;, pero escrito en &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Se implementa un sistema de impresión, en donde podemos encontrar la configuración de página, vista preliminar de impresión e impresión directa.&lt;br /&gt;&lt;br /&gt;Algunas capturas de pantalla de la aplicación a continuación:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRPPx9jlAJI/AAAAAAAABL8/ZInytZTCiCw/s1600/editor0.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRPPx9jlAJI/AAAAAAAABL8/ZInytZTCiCw/s640/editor0.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPy3toWYI/AAAAAAAABMA/d3oin5b4Rt8/s1600/editor1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="474" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPy3toWYI/AAAAAAAABMA/d3oin5b4Rt8/s640/editor1.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPy3toWYI/AAAAAAAABMA/d3oin5b4Rt8/s1600/editor1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPxXYOliI/AAAAAAAABL4/G-UN_ZMJK9c/s1600/editor3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="470" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPxXYOliI/AAAAAAAABL4/G-UN_ZMJK9c/s640/editor3.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPzUa9upI/AAAAAAAABME/AGDLeB3OKZc/s1600/editor2.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRPPzUa9upI/AAAAAAAABME/AGDLeB3OKZc/s640/editor2.JPG" width="612" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Cosas que faltan...&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En la impresión, no se hace un &lt;b&gt;wrapper&lt;/b&gt; del texto, es decir, no se tienen en cuenta los márgenes, por lo que si no se incluyen retornos de línea (&lt;i&gt;Enter&lt;/i&gt;) el texto se saldrá del área de impresión. Esto habría que arreglarlo...&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-6251419637011719047?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/6251419637011719047/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/wxpython-crear-un-editor-simple-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/6251419637011719047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/6251419637011719047'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/wxpython-crear-un-editor-simple-en.html' title='wxPython: Crear un editor simple, en Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y_bGxMwbE9g/TRPPx9jlAJI/AAAAAAAABL8/ZInytZTCiCw/s72-c/editor0.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4155814577831224339</id><published>2010-12-23T21:13:00.004+01:00</published><updated>2010-12-23T22:16:15.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyLorca'/><title type='text'>pyLorca en pruebas...</title><content type='html'>Hola. Esta tarde he publicado &lt;b&gt;pyLorca&lt;/b&gt;, un software para crear clases &lt;b&gt;Python&lt;/b&gt; a partir de sintaxis &lt;b&gt;Yaml&lt;/b&gt;. Bien, este programa está en fase de desarrollo, y dicho desarrollo lo he hecho en &lt;b&gt;Windows&lt;/b&gt;. Se supone que &lt;b&gt;Python&lt;/b&gt; funciona bien tanto en &lt;b&gt;Windows&lt;/b&gt; como en &lt;b&gt;Linux&lt;/b&gt;, sin apenas hacer cambios.&lt;br /&gt;&lt;br /&gt;Hay veces que hay que hacer cambios...&lt;br /&gt;&lt;br /&gt;He tenido un primer problema con las codificaciones, ya que en &lt;b&gt;Windows &lt;/b&gt;tenía una estructura de constantes de cadenas con la &lt;b&gt;u&lt;/b&gt; delante y en &lt;b&gt;Linux&lt;/b&gt; me ha dicho que nada de nada. El problema surge al pedir la ayuda de la aplicación, mediante &lt;b&gt;python pyLorca.py -h&lt;/b&gt;. En principio, para &lt;b&gt;Linux&lt;/b&gt;, da un problema de codificación.&lt;br /&gt;&lt;br /&gt;¿Dónde lo arreglamos?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TROsINPl88I/AAAAAAAABLs/Kl2dnf2k0M0/s1600/Pantallazo-angel%2540ubuntu%253A+%257E.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="424" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TROsINPl88I/AAAAAAAABLs/Kl2dnf2k0M0/s640/Pantallazo-angel%2540ubuntu%253A+%257E.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Simplemente omitiendo las &lt;b&gt;u&lt;/b&gt;: &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TROsJV7MbPI/AAAAAAAABLw/mv-vpkg7C74/s1600/Pantallazo-angel%2540ubuntu%253A+%257E-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="424" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TROsJV7MbPI/AAAAAAAABLw/mv-vpkg7C74/s640/Pantallazo-angel%2540ubuntu%253A+%257E-1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ahora ya funciona la ayuda:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TROsLw7yV0I/AAAAAAAABL0/egC5cNPSDuc/s1600/Pantallazo-angel%2540ubuntu%253A+%257E-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="524" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TROsLw7yV0I/AAAAAAAABL0/egC5cNPSDuc/s640/Pantallazo-angel%2540ubuntu%253A+%257E-2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El problema está en &lt;b&gt;Windows&lt;/b&gt;, donde si no ponemos la &lt;b&gt;u&lt;/b&gt;, salen caracteres extraños, aunque tengamos &lt;b&gt;utf-8&lt;/b&gt; configurado en el módulo y en el &lt;b&gt;sitecustomize.py&lt;/b&gt;. La verdad que no se donde puede estar el fallo (...bueno, sí que lo sé, es de &lt;span class="Apple-style-span" style="color: orange;"&gt;&lt;b&gt;Microsoft&lt;/b&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Si eres usuario de&lt;b&gt; Linux&lt;/b&gt; y no te funciona la ayuda por un tema de codificación, únicamente tienes que hacer los cambios que he comentado.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4155814577831224339?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4155814577831224339/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/pylorca-en-pruebas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4155814577831224339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4155814577831224339'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/pylorca-en-pruebas.html' title='pyLorca en pruebas...'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y_bGxMwbE9g/TROsINPl88I/AAAAAAAABLs/Kl2dnf2k0M0/s72-c/Pantallazo-angel%2540ubuntu%253A+%257E.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8426061207408660579</id><published>2010-12-23T14:52:00.022+01:00</published><updated>2010-12-23T15:31:54.972+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OGL'/><category scheme='http://www.blogger.com/atom/ns#' term='pyYAML'/><category scheme='http://www.blogger.com/atom/ns#' term='pyLorca'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>pyLorca: Diseño y diagrama de clases, en Python</title><content type='html'>Hola. En este post os presento una pequeña aplicación, desarrollada en&amp;nbsp;&lt;b&gt;Python&lt;/b&gt;, para diseñar clases en &lt;b&gt;Python&lt;/b&gt; de manera rápida, mediante sintaxis &lt;b&gt;&lt;a href="http://es.wikipedia.org/wiki/YAML"&gt;Yaml&lt;/a&gt;&lt;/b&gt;, y con la opción de poder visualizarlo gráficamente, al estilo &lt;i&gt;UML&lt;/i&gt;, aunque &lt;i&gt;no es UML&lt;/i&gt;. Este software se puede descargar del &lt;b&gt;site&lt;/b&gt; de &lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;El viaje del navegante&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/codigo"&gt;https://sites.google.com/site/elviajedelnavegante/codigo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Los requisitos para que funcione &lt;b&gt;pyLorca&lt;/b&gt; (a día de hoy) es tener instalado &lt;b&gt;pyYAML&lt;/b&gt;, que podéis descargar desde su página web,&amp;nbsp;&lt;a href="http://pyyaml.org/"&gt;http://pyyaml.org/&lt;/a&gt;. Opcionalmente, si se quiere utilizar el entorno gráfico, se ha de tener instalado &lt;b&gt;wxPython&lt;/b&gt;, que se puede conseguir en&amp;nbsp;&lt;a href="http://www.wxpython.org/"&gt;http://www.wxpython.org/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Al grano...&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Con &lt;b&gt;pyLorca&lt;/b&gt; de lo que se trata es crear código ó partes de código que normalmente se repiten a la hora de crear &lt;i&gt;clases bases&lt;/i&gt;, de las cuales más tarde se heredará (o no). La cuestión es crear, en un fichero &lt;b&gt;Yaml&lt;/b&gt;, las especificaciones de las clases y opcionalmente sus atributos, métodos y propiedades, así como comentarios. Automáticamente se generará un fichero &lt;b&gt;Python&lt;/b&gt; con el código resultado de dicha especificación.&lt;br /&gt;&lt;br /&gt;¿Por qué &lt;b&gt;Yaml&lt;/b&gt;? Pues porque tiene una sintaxis fácil de leer y comprensible, apta para poder ser manipulada de manera rápida. Esta es la principal baza de crear scripts en &lt;b&gt;Yaml&lt;/b&gt;:&amp;nbsp;poder diseñar jerarquías de clases de manera sencilla y muy rápida.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;b&gt;Un ejemplo sencillo...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagina que estás diseñando un problema... defines ciertas clases e identificas sus atributos. Claro, a dichos atributos se les tiene que poder asignar un valor y devolver dicho valor. Bien, podríamos utilizar propiedades en este caso. Otros atributos quizás no interese que sean propiedades, pero como buen programador quieres que sean atributos ocultos. Evidentemente, las clases tienen métodos. ¿La mejor manera de representar esta información? Vamos a verlo...&lt;br /&gt;&lt;br /&gt;Se nos plantea un problema que está definido por una clase, &lt;b&gt;padre&lt;/b&gt;, que tiene ciertos atributos que podrían accederse como propiedades, esto es, se les aplicará un &lt;b&gt;get&lt;/b&gt; y un &lt;b&gt;set&lt;/b&gt;. Hay otra clase, &lt;b&gt;hijo&lt;/b&gt;, que hereda de la clase &lt;b&gt;padre&lt;/b&gt;, y que tiene propiedades suyas. Podríamos escribirlo tal que así:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;clase: padre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;propiedades:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- altura&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- peso&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- edad&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- etnia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;clase: hijo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;hereda_de: padre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- color_ojos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, si esto lo escribimos en código &lt;b&gt;Python&lt;/b&gt; tendríamos algo parecido a esto:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;class padre(object):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__altura = None&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__peso = None&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__edad = None&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__etnia = None&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getAltura(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__altura&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getPeso(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__peso&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getEdad(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__edad&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getEtnia(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__etnia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setAltura(self, altura):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__altura = altura&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setPeso(self, peso):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__peso = peso&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setEdad(self, edad):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__edad = edad&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setEtnia(self, etnia):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__etnia = etnia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;altura = property(fget = __getAltura,fset = __setAltura)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;peso = property(fget = __getPeso,fset = __setPeso)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;edad = property(fget = __getEdad,fset = __setEdad)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;etnia = property(fget = __getEtnia,fset = __setEtnia)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;class hijo(padre):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;padre.__init__(self)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__color_ojos = None&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getColor_ojos(self):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__color_ojos&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setColor_ojos(self, color_ojos):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__color_ojos = color_ojos&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;color_ojos = property(fget = __getColor_ojos,fset = __setColor_ojos)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, como podemos observar hay una &lt;i&gt;pequeña&lt;/i&gt;&amp;nbsp;diferencia de número de líneas de código entre la notación de arriba y la de abajo, en &lt;b&gt;Python&lt;/b&gt;. Pues bien, la primera notación es sintaxis &lt;b&gt;Yaml.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;pyLorca&lt;/b&gt; lo que hace es, a partir de un fichero con la notación &lt;b&gt;Yaml,&lt;/b&gt; generar en un fichero &lt;b&gt;Python&lt;/b&gt; (&lt;b&gt;.py&lt;/b&gt;) el segundo código expuesto.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Un ejemplo algo más completo&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El fichero de configuración &lt;b&gt;Yaml&lt;/b&gt; tiene dos secciones diferenciadas, una para la configuración del código que se genera en el fichero &lt;b&gt;.py&lt;/b&gt; y otra compuesta por un conjunto de documentos que identifican a cada una de las clases que estamos definiendo. &lt;i&gt;¿Difícil?&lt;/i&gt; Más sencillo ahora...&lt;br /&gt;&lt;br /&gt;Fichero &lt;b&gt;Yaml &lt;/b&gt;con todos los parámetros posibles:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;# YAML&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;fichero_python_a_generar:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;comentario:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;indentacion:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;prefijo_clases:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;clase:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;hereda_de:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;atributos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;metodos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;comentario:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La primera sección, como podemos ver, sirve para configurar el nombre del fichero &lt;b&gt;Python&lt;/b&gt; que se generará, un comentario que se incluirá al principio del módulo, el nivel de indentación que se quiere para el código y un prefijo que se puede incluir en el nombre de las clases cuando se generan.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La segunda sección se denomina conjuntos de documentos. Vemos que podemos definir el nombre de la clase, de qué clase ó clases hereda, la lista de propiedades, la lista de atributos, la lista de métodos y un comentario sobre lo que hace dicha clase.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si queremos definir 2 clases, tendremos que tener dos documentos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;---&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;clase:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;hereda_de:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;propiedades:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;atributos:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;metodos:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;comentario:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;---&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;clase:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;hereda_de:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;propiedades:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;atributos:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;metodos:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;comentario:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Fijarse que un documento (definición de clase) se separa de otro mediante tres guiones&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;---&lt;/span&gt;&lt;/b&gt;. Además, para terminar se los documentos utilizamos tres puntos &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;...&lt;/span&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Ahora que sabemos la teoría vamos a crear el mismo ejemplo de antes, pero algo más completo. Decir que no es necesario escribir todos los elementos ó campos &lt;b&gt;Yaml&lt;/b&gt;, aunque sí que es obligatorio escribir al menos un elemento para definir las dos secciones.&lt;br /&gt;&lt;br /&gt;Fichero &lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;ejemplo_navegante.yaml&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;# YAML&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;fichero_python_a_generar: ejemplo_navegante.py&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;comentario: |&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;Este es el módulo de prueba de pyLorca,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;escrito para el blog de El viaje del navegante.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;indentacion: 6&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;prefijo_clases: base&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;clase: padre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- altura&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- peso&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- edad&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- etnia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;comentario: |&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;Esta es la clase padre, de la cual&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;hereda la clase hijo.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;clase: hijo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;hereda_de: padre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- color_ojos&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;comentario: |&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;Este es un ejemplo de una clase que hereda&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;de otra clase.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Código generado en el fichero &lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;ejemplo_navegante.py&lt;/span&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Código generado por pyLorca v0.0.1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Fecha creación: 2010-12-23&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Definición: Este es el módulo de prueba de pyLorca,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;escrito para el blog de El viaje del navegante.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;class base_padre(object):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Esta es la clase padre, de la cual&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;hereda la clase hijo.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__altura = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__peso = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__edad = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__etnia = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getAltura(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__altura&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getPeso(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__peso&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getEdad(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__edad&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getEtnia(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__etnia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setAltura(self, altura):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__altura = altura&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setPeso(self, peso):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__peso = peso&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setEdad(self, edad):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__edad = edad&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setEtnia(self, etnia):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__etnia = etnia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;altura = property(fget = __getAltura,fset = __setAltura)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;peso = property(fget = __getPeso,fset = __setPeso)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;edad = property(fget = __getEdad,fset = __setEdad)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;etnia = property(fget = __getEtnia,fset = __setEtnia)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;class base_hijo(base_padre):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Este es un ejemplo de una clase que hereda&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;de otra clase.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;base_padre.__init__(self)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__color_ojos = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getColor_ojos(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__color_ojos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setColor_ojos(self, color_ojos):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__color_ojos = color_ojos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;color_ojos = property(fget = __getColor_ojos,fset = __setColor_ojos)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;Vale... comentamos lo que hemos hecho. En el fichero &lt;b&gt;Yaml&lt;/b&gt; hemos indicado que queríamos que el código &lt;b&gt;Python&lt;/b&gt; tuviera una indentación de código de 6 espacios en blanco, que las clases tuvieran un prefijo con el vocablo "&lt;u&gt;base&lt;/u&gt;", y que al principio del módulo incluyese un comentario: "&lt;u&gt;Este es el módulo de prueba de pyLorca, e&lt;/u&gt;&lt;u&gt;scrito para el blog de El viaje del navegante.&lt;/u&gt;" Ver también que se incluye en el fichero &lt;b&gt;.py&lt;/b&gt;&amp;nbsp;el tipo de codificación &lt;b&gt;utf-8&lt;/b&gt;, así como una reseña que el código ha sido generado por &lt;b&gt;pyLorca&lt;/b&gt; y la fecha de generación.&lt;br /&gt;&lt;br /&gt;Con respecto a la definición de las clases, hace exactamente lo que hemos indicado. La clase &lt;b&gt;padre&lt;/b&gt; tiene una serie de propiedades (&lt;b&gt;get&lt;/b&gt; y &lt;b&gt;set&lt;/b&gt;) que hemos diseñado y se ha generado todo el código correspondiente para su utilización, además de un comentario al principio de la clase. La clase &lt;b&gt;hijo&lt;/b&gt;, tal como se ha especificado, hereda de la clase &lt;b&gt;padre&lt;/b&gt; (mira el &lt;i&gt;__init__&lt;/i&gt;), además de tener otras propiedades suyas (...decir propiedades propias suena redundante...).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Sintaxis Yaml&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La sintaxis &lt;b&gt;Yaml&lt;/b&gt; es muy sencilla, es por ello que he escogido este sistema para definir las clases y no otros, como &lt;b&gt;XML&lt;/b&gt;, que resulta algo más tedioso de leer y escribir. Con &lt;b&gt;Yaml&lt;/b&gt; es como si hiciéramos la lista de la compra. En &lt;a href="http://www.google.com/"&gt;San Google&lt;/a&gt; hay multitud de manuales sobre &lt;b&gt;Yaml&lt;/b&gt;, pero aquí os indico cómo definir ficheros &lt;b&gt;Yaml&lt;/b&gt; para &lt;b&gt;pyLorca&lt;/b&gt;, que de verdad que es muy fácil.&lt;br /&gt;&lt;br /&gt;En el inicio del fichero &lt;b&gt;Yaml&lt;/b&gt; incluir la etiqueta siguiente:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;#YAML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una cadena de información es una etiqueta, dos puntos, espacio y el valor de esa etiqueta.&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;etiqueta: información de la etiqueta&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una lista de parámetros es una etiqueta y dos puntos, y en las líneas siguientes, dos espacios, guion, espacio, elemento de la lista:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;lista:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- elemento1&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;- elemento2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un comentario es una etiqueta con dos puntos, espacio, carácter &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;|&lt;/span&gt;&lt;/b&gt;, y en las líneas siguientes, dos espacios y el comentario, que se puede dividir en varias líneas, pero al iniciar cada línea, siempre con dos espacios en blanco.&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;comentario: |&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;Comentario de El viaje del navegante&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;para los usuarios de Python.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cosas a tener en cuenta. Mucho cuidado con los espacios en blanco, hay que dejarlos tal como comento, ya que de lo contrario &lt;b&gt;Yaml&lt;/b&gt; no funciona, es muy estricto en este tema, al igual que &lt;b&gt;Python&lt;/b&gt; con la indentación de código.&lt;br /&gt;&lt;br /&gt;Bien, en &lt;b&gt;pyLorca&lt;/b&gt;, los elementos &lt;i&gt;propiedades&lt;/i&gt;, &lt;i&gt;atributos&lt;/i&gt; y &lt;i&gt;metodos&lt;/i&gt; son listas. Los elementos &lt;i&gt;comentario&lt;/i&gt; son comentarios. Los demás son elementos de cadena.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTA IMPORTANTE:&lt;/b&gt; Para gente que ya conozca &lt;b&gt;Yaml&lt;/b&gt; puede resultar extraño cómo me refiero a algunos elementos, pero este post está orientado al público en general. Perdonad mi simpleza...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Más cosas...&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En la definición del fichero &lt;b&gt;Yaml&lt;/b&gt; hay elementos que puedes obviar ó no. Por ejemplo, si defines una clase que no hereda de nadie, no es necesario incluir &lt;b&gt;hereda_de:&lt;/b&gt;. Aunque si o haces no pasa nada. Incluso si escribes &lt;b&gt;hereda_de: object&lt;/b&gt; sigue sin pasar nada. Con esto quiero decir que pyLorca es flexible a la hora de buscar información, pero ten en cuenta que lo que escribas tiene que ir en perfecta sintaxis &lt;b&gt;Yaml&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;El ejemplo más completo, herencia múltiple, ¡¡¡más madera!!!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a incluir todos los parámetros de configuración en un ejemplo y además, vamos a incluir otra clase, para comprobar que &lt;b&gt;pyLorca&lt;/b&gt; soporta herencia múltiple.&lt;br /&gt;&lt;br /&gt;El fichero &lt;b&gt;Yaml&lt;/b&gt; tiene el siguiente contenido:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;# YAML&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;fichero_python_a_generar: ejemplo_navegante.py&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;comentario: |&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;Este es el módulo de prueba de pyLorca,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;escrito para el blog de El viaje del navegante.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;indentacion: 6&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;prefijo_clases: base&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;clase: padre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- altura&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- peso&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- etnia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;atributos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- dinero&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;metodos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- jugar_con_peque&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;comentario: |&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;Esta es la clase padre, de la cual&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;hereda la clase hijo.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;clase: madre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;hereda_de: object&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- nivel_inteligencia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;atributos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- saber_estar&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- cordura&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;metodos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- trabajar&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- amar&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;comentario: |&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;Clase que define a la madre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;que es la reina.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;clase: hijo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;hereda_de: padre, madre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- color_ojos&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;atributos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- edad&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;metodos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;- jugar_con_osito&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;comentario: |&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;Esta clase hereda de papá y mamá&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;&amp;nbsp;&amp;nbsp;y se hará mayor y grande.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #741b47;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Y &lt;b&gt;pyLorca&lt;/b&gt; lo interpreta y genera dentro del fichero &lt;b&gt;ejemplo_navegante.py&lt;/b&gt; lo siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Código generado por pyLorca v0.0.1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Fecha creación: 2010-12-23&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Definición: Este es el módulo de prueba de pyLorca,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;escrito para el blog de El viaje del navegante.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;class base_padre(object):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Esta es la clase padre, de la cual&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;hereda la clase hijo.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__altura = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__peso = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__etnia = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__dinero = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Métodos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def jugar_con_peque(self): pass&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getAltura(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__altura&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getPeso(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__peso&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getEtnia(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__etnia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setAltura(self, altura):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__altura = altura&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setPeso(self, peso):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__peso = peso&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setEtnia(self, etnia):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__etnia = etnia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;altura = property(fget = __getAltura,fset = __setAltura)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;peso = property(fget = __getPeso,fset = __setPeso)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;etnia = property(fget = __getEtnia,fset = __setEtnia)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;class base_madre(object):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Clase que define a la madre&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;que es la reina.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__nivel_inteligencia = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__saber_estar = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__cordura = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Métodos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def trabajar(self): pass&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def amar(self): pass&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getNivel_inteligencia(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__nivel_inteligencia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setNivel_inteligencia(self, nivel_inteligencia):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__nivel_inteligencia = nivel_inteligencia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;nivel_inteligencia = property(fget = __getNivel_inteligencia,fset = __setNivel_inteligencia)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;class base_hijo(base_padre,base_madre):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Esta clase hereda de papá y mamá&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;y se hará mayor y grande.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Constructor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;base_padre.__init__(self)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;base_madre.__init__(self)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__color_ojos = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__edad = None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Métodos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def jugar_con_osito(self): pass&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Getters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __getColor_ojos(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__color_ojos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Setters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;def __setColor_ojos(self, color_ojos):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__color_ojos = color_ojos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;# Properties&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;color_ojos = property(fget = __getColor_ojos,fset = __setColor_ojos)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;b&gt;¿Cómo llamar a pyLorca?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;pyLorca&lt;/b&gt; funciona en modo texto, simplemente escribiendo&amp;nbsp;&lt;b&gt;python pylorca.py -h&lt;/b&gt; tendremos la ayuda en línea de cómo funciona. Si ya tenemos creado nuestro fichero &lt;b&gt;Yaml&lt;/b&gt;, &lt;b&gt;python pylorca.py fichero.yaml&lt;/b&gt; y genera el fichero &lt;b&gt;Python&lt;/b&gt; descrito dentro del fichero &lt;b&gt;Yaml&lt;/b&gt;. Si queremos que &lt;b&gt;pyLorca&lt;/b&gt; nos genere de forma automática una plantilla, &lt;b&gt;python pylorca.py -p fichero.yaml&lt;/b&gt;. Más información en la ayuda.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8cuKxKXI/AAAAAAAABLI/W_LdPS4h_yg/s1600/pylorca1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="432" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8cuKxKXI/AAAAAAAABLI/W_LdPS4h_yg/s640/pylorca1.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8dY_izxI/AAAAAAAABLM/ZVhpnGtUotg/s1600/pylorca2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="446" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8dY_izxI/AAAAAAAABLM/ZVhpnGtUotg/s640/pylorca2.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRM8eBUZtdI/AAAAAAAABLQ/12eIyn6Is7c/s1600/pylorca3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRM8eBUZtdI/AAAAAAAABLQ/12eIyn6Is7c/s640/pylorca3.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRM8evj8S_I/AAAAAAAABLU/SNv-ZRe3gtw/s1600/pylorca4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRM8evj8S_I/AAAAAAAABLU/SNv-ZRe3gtw/s640/pylorca4.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8bXAw29I/AAAAAAAABLE/88uVJKd0bRE/s1600/pylorca5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8bXAw29I/AAAAAAAABLE/88uVJKd0bRE/s1600/pylorca5.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;pyLorca en modo gráfico...&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;pyLorca&lt;/b&gt; también tiene la posibilidad de trabajar en modo gráfico, si se tiene instalado &lt;b&gt;wxPython 2.8.11&lt;/b&gt; ó versión compatible. Se invoca mediante &lt;b&gt;python pylorca.py -g&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRNHnxjWvYI/AAAAAAAABLY/FkYtrLQXBAs/s1600/pylorca6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="399" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRNHnxjWvYI/AAAAAAAABLY/FkYtrLQXBAs/s640/pylorca6.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El funcionamiento gráfico es mucho más intuitivo, si cabe, que en modo texto. Podemos cargar ficheros &lt;b&gt;Yaml&lt;/b&gt; desde el botón de que vemos abajo (&lt;i&gt;Fichero conf. YAML&lt;/i&gt;). Una vez cargado podemos generar el diagrama gráficamente (botón &lt;i&gt;Generar diagrama&lt;/i&gt;) y/o generar el código &lt;b&gt;Python&lt;/b&gt; (botón &lt;i&gt;Generar código Python&lt;/i&gt;), el cual podemos previsualizar una vez generado. También podemos editar el código Yaml haciendo click en el botón &lt;i&gt;Editor&lt;/i&gt;.&amp;nbsp;Como se puede observar podemos imprimir los diagramas que hagamos (botones de impresión).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRNSaBf2cEI/AAAAAAAABLg/9SIJA1wJmag/s1600/pylorca7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRNSaBf2cEI/AAAAAAAABLg/9SIJA1wJmag/s640/pylorca7.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRNSa8ShUtI/AAAAAAAABLk/LTm2DdaJmWU/s1600/pylorca8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRNSa8ShUtI/AAAAAAAABLk/LTm2DdaJmWU/s640/pylorca8.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRNSZX2n3bI/AAAAAAAABLc/zFo9ZzxTptQ/s1600/pylorca9.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="364" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRNSZX2n3bI/AAAAAAAABLc/zFo9ZzxTptQ/s640/pylorca9.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Una última consideración... ó dos...&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hay veces en las cuales el atributo (no propiedad) de una clase es una instanciación de otra clase. &lt;b&gt;pyLorca&lt;/b&gt; lo contempla. Es más, se pueden inicializar los atributos ó propiedades en el propio fichero &lt;b&gt;Yaml&lt;/b&gt;. Así por ejemplo, para el siguiente fichero &lt;b&gt;Yaml&lt;/b&gt; tenemos:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;# YAML&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;fichero_python_a_generar: ejemplo2.py&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;clase: ubicacion&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- direccion&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- poblacion&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- provincia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- cp&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;clase: persona&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;atributos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- nombre&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- apellidos&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- nif&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;clase: usuario&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;hereda_de: persona&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;propiedades:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- clave_acceso = 123456&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;atributos:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&amp;nbsp;&amp;nbsp;- direccion = ubicacion()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Darse cuenta del atributo &lt;i&gt;direccion&lt;/i&gt; de la clase &lt;b&gt;persona&lt;/b&gt;, el cual está inicializado con una instanciación de la clase &lt;b&gt;ubicacion&lt;/b&gt;. Gráficamente &lt;b&gt;pyLorca&lt;/b&gt; lo representa de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRNaTz3upqI/AAAAAAAABLo/W00qO4Do8K0/s1600/pylorca10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRNaTz3upqI/AAAAAAAABLo/W00qO4Do8K0/s640/pylorca10.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El código &lt;b&gt;Python&lt;/b&gt;, generado en el fichero &lt;b&gt;ejemplo2.py&lt;/b&gt;, es el siguiente:&lt;br /&gt;&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;'''&lt;br /&gt;Código generado por pyLorca v0.0.1&lt;br /&gt;Fecha creación: 2010-12-23&lt;br /&gt;'''&lt;br /&gt;&lt;br /&gt;class ubicacion(object):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Constructor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__direccion = None&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__poblacion = None&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__provincia = None&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__cp = None&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Getters&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getDireccion(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__direccion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getPoblacion(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__poblacion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getProvincia(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__provincia&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getCp(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__cp&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Setters&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setDireccion(self, direccion):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__direccion = direccion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setPoblacion(self, poblacion):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__poblacion = poblacion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setProvincia(self, provincia):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__provincia = provincia&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setCp(self, cp):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__cp = cp&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;direccion = property(fget = __getDireccion,fset = __setDireccion)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;poblacion = property(fget = __getPoblacion,fset = __setPoblacion)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;provincia = property(fget = __getProvincia,fset = __setProvincia)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cp = property(fget = __getCp,fset = __setCp)&lt;br /&gt;&lt;br /&gt;class persona(object):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Constructor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__nombre = None&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__apellidos = None&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__nif = None&lt;br /&gt;&lt;br /&gt;class usuario(persona):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Constructor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;persona.__init__(self)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__clave_acceso = 123456&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.direccion = ubicacion()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Getters&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __getClave_acceso(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__clave_acceso&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Setters&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __setClave_acceso(self, clave_acceso):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.__clave_acceso = clave_acceso&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;clave_acceso = property(fget = __getClave_acceso,fset = __setClave_acceso)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;¿Cómo se ha programado pyLorca?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pyLorca&lt;/b&gt; era al inicio un conjunto de ficheros, donde cada módulo desempeñaba su papel: vista, pyyaml, &amp;nbsp;tratamiento de sintaxis, editor. Lo he juntado todo en un único fichero por simple comodidad por parte del usuario.&lt;br /&gt;&lt;br /&gt;La parte gráfica de &lt;b&gt;pyLorca&lt;/b&gt;, escrita en &lt;b&gt;wxPython&lt;/b&gt;, utiliza &lt;b&gt;OGL&lt;/b&gt; para el diseño de las cajas divididas. Las rutinas de impresión las he sacado de la &lt;b&gt;Demo de wxPython&lt;/b&gt;. Es más, si entráis en el código veréis algunas partes (muy pocas) comentadas en inglés, y es porque las he sacado iguales a las originales. Lo importante de aprender &lt;b&gt;wxPython&lt;/b&gt; es fijarse en el código, ver y comprender cómo funciona, para poder modificarlo y hacer lo que nosotros queremos que haga.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;Mejoras...&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esta aplicación debe de tener muchos &lt;b&gt;bugs&lt;/b&gt;, que conforme pase el tiempo iré detectando y corrigiendo. Como mejoras para la siguiente versión caben destacar:&lt;br /&gt;- Creación gráfica de clases.&lt;br /&gt;- Creación gráfica de relaciones entre clases.&lt;br /&gt;- Generación de código &lt;b&gt;Yaml&lt;/b&gt; a partir de la creación gráfica de clases.&lt;br /&gt;- &lt;i&gt;Wrapper&lt;/i&gt; a la impresión de texto y gráficos, ya que no se controlan los márgenes.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;b&gt;CONCLUSIONES&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pyLorca&lt;/b&gt; es una aplicación escrita en &lt;b&gt;Python&lt;/b&gt;, para crear &lt;b&gt;&lt;i&gt;scripts Python&lt;/i&gt;&lt;/b&gt;, que utiliza ficheros de sintaxis &lt;b&gt;Yaml&lt;/b&gt; para generarlos. Sirve para diseñar con muy pocas líneas de código y en una sintaxis muy fácil, &lt;i&gt;clases y relaciones&lt;/i&gt;, para generar el consiguiente código &lt;b&gt;Python&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8426061207408660579?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8426061207408660579/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/pylorca-diseno-y-diagrama-de-clases-en.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8426061207408660579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8426061207408660579'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/pylorca-diseno-y-diagrama-de-clases-en.html' title='pyLorca: Diseño y diagrama de clases, en Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_y_bGxMwbE9g/TRM8cuKxKXI/AAAAAAAABLI/W_LdPS4h_yg/s72-c/pylorca1.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4286702833113050213</id><published>2010-12-22T20:27:00.000+01:00</published><updated>2010-12-22T20:27:59.548+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyLorca'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><category scheme='http://www.blogger.com/atom/ns#' term='wxFormBuilder'/><title type='text'>wxPython: herencia, parámetros y otras hierbas con wxFormBuilder, en español</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Hola. Continuando con la serie de posts sobre&amp;nbsp;&lt;b&gt;wxPython&lt;/b&gt;&amp;nbsp;y&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;vamos a ver ahora cómo pasar información entre&amp;nbsp;&lt;b&gt;widgets&lt;/b&gt;, así como la utilización de la herencia entre objetos y otras cosas. El ejemplo completo (muy comentado) está en el&amp;nbsp;&lt;a href="https://sites.google.com/site/elviajedelnavegante/"&gt;repositorio de El viaje del navegante&lt;/a&gt;:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/codigo"&gt;https://sites.google.com/site/elviajedelnavegante/codigo&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;El fichero es&amp;nbsp;&lt;b&gt;&lt;u&gt;&lt;i&gt;Gestión de almacén.zip&lt;/i&gt;&lt;/u&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Lo que vamos a construir es una pequeña aplicación que va a simular un gestor de almacén específico, con familias, modelos y submodelos de productos. Además se incluye un sistema de reports (informes) en&amp;nbsp;&lt;i&gt;HTML&lt;/i&gt;. La aplicación es muy sencilla, lo que da mucho juego a la hora de completarla. Es más, incluso para guardar los datos en disco se utiliza la persistencia de datos, para ser lo más aséptico posible, y que el propio lector pueda comprender y asimilar lo verdaderamente importante, el uso de los&amp;nbsp;&lt;b&gt;widgets&lt;/b&gt;&amp;nbsp;en&amp;nbsp;&lt;b&gt;wxPython&lt;/b&gt;&amp;nbsp;y el paso de información entre los mismos. Para ello, hay que tener muy claro el concepto de herencia, ya que para utilizar&amp;nbsp;&lt;b&gt;wxPython&lt;/b&gt;&amp;nbsp;es indispensable.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Esta aplicación es para aprender, ya que le faltan muchas cosas, pero lo básico lo tiene. Faltaría por ejemplo estadísticas, control de stock, relación de lotes con sus correspondientes albaranes de entrada, y un sin fin más. La búsqueda de información se podría hacer implementando reports para tal uso, parametrizando la llamada de los mismos. Se deja al lector esta tarea. Aquí únicamente se muestra el camino.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;IMPORTANTE&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;: Decir que el ejemplo está muy comentado, por lo que es muy conveniente descargarse el código, para leer los comentarios y poder saber el porqué hago lo que hago.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;¿Qué compone el proyecto? De las siguientes partes:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;MODELO DE DATOS&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-&amp;nbsp;&lt;b&gt;clases_gestion_almacen.py&lt;/b&gt;: Código generado con&amp;nbsp;&lt;b&gt;pyLorca&lt;/b&gt;, una aplicación (escrita por mí) para crear a partir de ficheros&amp;nbsp;&lt;b&gt;Yaml&lt;/b&gt;, módulos de clases bases, con propiedades, métodos y atributos.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRJH98lcPAI/AAAAAAAABKc/CuOJKypalOc/s1600/gestion_almacen0.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRJH98lcPAI/AAAAAAAABKc/CuOJKypalOc/s640/gestion_almacen0.JPG" style="cursor: move;" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-&amp;nbsp;&lt;b&gt;gestion_almacen_modelo.py&lt;/b&gt;: Este módulo contiene las clases que contendrán la información que se guardará en disco y algunas funciones más que nos serán de ayuda. Este modelo importa&amp;nbsp;&lt;b&gt;clases_gestion_almacen.py&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;VISTA&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-&amp;nbsp;&lt;b&gt;gestion_almacen_vista.py&lt;/b&gt;: Código generado automáticamente por&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;(a través del fichero de proyecto&amp;nbsp;&lt;b&gt;gestion_almacen.fbp&lt;/b&gt;), en donde se diseña por completo todo el&amp;nbsp;&lt;i&gt;frontend&lt;/i&gt;&amp;nbsp;gráfico de la aplicación.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;APLICACIÓN&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-&amp;nbsp;&lt;b&gt;gestion_almacen.py&lt;/b&gt;: Este módulo importa clases de los demás módulos y es la aplicación principal. Junta el modelo de datos con la vista.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;¿Cómo funciona?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Se ejecuta con:&amp;nbsp;&lt;b&gt;python gestion_almacen.py&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRJJUhfe1GI/AAAAAAAABKg/qfsNCS4g_Oo/s1600/gestion_almacen1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRJJUhfe1GI/AAAAAAAABKg/qfsNCS4g_Oo/s1600/gestion_almacen1.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Lo primero es crear familias, modelos y submodelos. Nos vamos al menú&amp;nbsp;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Clasificación&lt;/span&gt;&amp;nbsp;y a insertar datos...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRJJ2vt_cXI/AAAAAAAABKk/FPqznepHkj4/s1600/gestion_almacen2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRJJ2vt_cXI/AAAAAAAABKk/FPqznepHkj4/s1600/gestion_almacen2.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Podemos incluir tantos elementos como queramos. El único requisito es que no pueden repetirse, ya que el sistema no lo permite (un requisito para no tener problemas de duplicidades...). &amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Importante: Siempre dar al botón&amp;nbsp;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Guardar&lt;/span&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Podemos ver los datos incluidos en el&amp;nbsp;&lt;b&gt;wx.Choice&lt;/b&gt;...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRJKm_CBpoI/AAAAAAAABKo/GuKxvuTFC-c/s1600/gestion_almacen3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRJKm_CBpoI/AAAAAAAABKo/GuKxvuTFC-c/s1600/gestion_almacen3.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Mediante la referencia entre&amp;nbsp;&lt;b&gt;widgets&lt;/b&gt;, dichos elementos pasan al&amp;nbsp;&lt;b&gt;frame&lt;/b&gt;&amp;nbsp;principal...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRJK5gIdveI/AAAAAAAABKs/T24Y70RFKMM/s1600/gestion_almacen4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRJK5gIdveI/AAAAAAAABKs/T24Y70RFKMM/s1600/gestion_almacen4.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;También hay que crear los almacenes...&amp;nbsp;Si queremos crear un producto hay que dar valores a todos los campos, y a continuación darle al botón&amp;nbsp;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Guardar&lt;/span&gt;...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRJLfdWE8CI/AAAAAAAABKw/puYUXdNNzzA/s1600/gestion_almacen5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRJLfdWE8CI/AAAAAAAABKw/puYUXdNNzzA/s1600/gestion_almacen5.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Podemos ver lo que hemos hecho en los informes...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRJMpmi7ASI/AAAAAAAABK0/0bQm--se1jA/s1600/gestion_almacen36.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRJMpmi7ASI/AAAAAAAABK0/0bQm--se1jA/s1600/gestion_almacen36.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Este tipo de informe es una página&amp;nbsp;&lt;b&gt;html&lt;/b&gt;...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRJNGDbOVxI/AAAAAAAABK4/03ELRbjGA9E/s1600/gestion_almacen7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="379" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRJNGDbOVxI/AAAAAAAABK4/03ELRbjGA9E/s640/gestion_almacen7.JPG" style="cursor: move;" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;¿Dónde se guardan los datos? He utilizado persistencia de datos con&amp;nbsp;&lt;b&gt;cPickle&lt;/b&gt;. Se nos generarán los siguientes ficheros...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRJNobFNihI/AAAAAAAABK8/CA86o7bAh7g/s1600/gestion_almacen8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRJNobFNihI/AAAAAAAABK8/CA86o7bAh7g/s1600/gestion_almacen8.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;b&gt;CONCLUSIONES&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;En este post se ha presentado un ejemplo para ver cómo se pasan parámetros (información) entre&amp;nbsp;&lt;b&gt;widgets&lt;/b&gt;&amp;nbsp;(&lt;b&gt;wx.Choice&lt;/b&gt;, etc.). Se ha utilizado&amp;nbsp;&lt;b&gt;pyLorca&lt;/b&gt;&amp;nbsp;para la generación de las clases bases, así como&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;para la generación íntegra del entorno gráfico. Si no disponemos de un sistema de reports siempre podemos utilizar páginas web para lanzar informes. Se deja al lector la parametrización de los mismos para implementar un sistema de búsqueda. Por último decir que se ha utilizado el módulo&amp;nbsp;&lt;b&gt;cPickle&lt;/b&gt;&amp;nbsp;para la persistencia de datos.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4286702833113050213?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4286702833113050213/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/wxpython-herencia-parametros-y-otras.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4286702833113050213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4286702833113050213'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/wxpython-herencia-parametros-y-otras.html' title='wxPython: herencia, parámetros y otras hierbas con wxFormBuilder, en español'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_y_bGxMwbE9g/TRJH98lcPAI/AAAAAAAABKc/CuOJKypalOc/s72-c/gestion_almacen0.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-6669131129889143528</id><published>2010-12-21T17:35:00.002+01:00</published><updated>2010-12-21T17:39:54.554+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recursos documentales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Recursos documentales en la red, y 4</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRC8bImJUTI/AAAAAAAABKU/_qzCeUre1HA/s1600/python+perfecto.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRC8bImJUTI/AAAAAAAABKU/_qzCeUre1HA/s1600/python+perfecto.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Hola. Como viene siendo habitual en este &lt;b&gt;blog&lt;/b&gt;, cada cierto tiempo hago una recopilación de sitios en donde he estado y que me han servido para algo. Fiel a mi costumbre de compartirlo todo (...mmm casi todo), os dejo enlaces en donde encontraréis cosas curiosas (ó no) relacionadas con &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;otras hierbas&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Como siempre, hago una distinción por áreas, para que sea más fácil ir a buscar lo que se quiere encontrar, cosa que no siempre se puede esperar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;PYTHON&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://pypi.python.org/pypi?:action=index"&gt;Índice de paquetes para Python&lt;/a&gt;: Lugar donde se pueden encontrar el listado oficial de paquetes disponibles para &lt;b&gt;Python&lt;/b&gt; (módulos de extensión).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.java2s.com/"&gt;Tutoriales de programación y ejemplos de código fuente&lt;/a&gt;: Sitio de lo más interesante, ya que no solamente se habla de &lt;b&gt;Python&lt;/b&gt;, sino de una gran variedad de lenguajes de programación. Lo bueno de esta web es la cantidad de ejemplos que hay, algo a tener muy en cuenta, ya que para aprender &lt;b&gt;Python&lt;/b&gt;, y cualquier lenguaje en general, es necesario ver ejemplos de código reales. Dentro de este sitio podemos encontrar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.java2s.com/Code/Python/CatalogPython.htm"&gt;Ejemplos de código fuente Python organizados por temas.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.java2s.com/Tutorial/Python/CatalogPython.htm"&gt;Tutoriales de Python&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://wiki.python.org/moin/PythonEditors"&gt;Herramientas de desarrollo para Python&lt;/a&gt;: Lista de herramientas para desarrollar en &lt;b&gt;Python&lt;/b&gt;, esto es, editores, gui's e ide's, del sitio oficial de &lt;b&gt;Python&lt;/b&gt;, &lt;b&gt;&lt;a href="http://www.python.org/"&gt;www.python.org&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://wiki.python.org/moin/SpanishLanguage"&gt;Recursos documentales para Python en español&lt;/a&gt;: Material, webs y blogs de recursos documentales sobre &lt;b&gt;Python&lt;/b&gt;, en español.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.tutorialspoint.com/python/"&gt;Tutoriales para Python - Centro de aprendizaje&lt;/a&gt;: Sitio web, en inglés, en donde podemos encontrar recursos para aprender &lt;b&gt;Python&lt;/b&gt;, inlcuyendo niveles básico y avanzado.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://python.org.ar/pyar/Tutorial?action=AttachFile&amp;amp;do=view&amp;amp;target=TutorialPython.pdf"&gt;Tutorial Python&lt;/a&gt;: Tutorial, en español, de &lt;b&gt;Python&lt;/b&gt;. Creado por &lt;a href="http://python.org.ar/pyar/"&gt;PyAr&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://jessenoller.com/"&gt;El blog de Jesse Noller&lt;/a&gt;: Blog de programación &lt;b&gt;Python&lt;/b&gt;. Está en inglés, pero este hombre cuenta cosas muy interesantes.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.blog.pythonlibrary.org/"&gt;El blog de Mike Driscoll&lt;/a&gt;: Blog de un gurú de &lt;b&gt;Python&lt;/b&gt;, también en inglés. Muy buenos posts sobre todo lo que escribe Mike. Gracias a &lt;a href="http://alvarezalonso.es/monobotblog/"&gt;monoBOT&lt;/a&gt;, ¡por mostrarme el camino del &lt;i&gt;samurai&lt;/i&gt;!, supe de la existencia de &lt;i&gt;&lt;b&gt;Mike Driscoll&lt;/b&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://spinecho.ze.cx/"&gt;Página de Spinecho&lt;/a&gt;: Código fuente de aplicaciones &lt;b&gt;Python&lt;/b&gt;. Para aprender.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://linuxplatanos.byethost12.com/"&gt;Linux Plátanos&lt;/a&gt;: Sitio web en donde encontrar temática &lt;b&gt;GNU&lt;/b&gt; y &lt;b&gt;Python&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.djangobook.com/"&gt;El libro de Django&lt;/a&gt;: Pues eso, el libro online de &lt;b&gt;Django&lt;/b&gt;. En inglés.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;RAD ESCRITORIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;a href="http://dabodev.com/"&gt;DABO&lt;/a&gt;: Sitio en donde nos encontramos el software &lt;b&gt;Dabo&lt;/b&gt;, para crear de manera rápida aplicaciones de escritorio en &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.python-camelot.com/"&gt;CAMELOT&lt;/a&gt;:&amp;nbsp;Sitio en donde nos encontramos el software &lt;b&gt;Camelot&lt;/b&gt;, para crear de manera rápida aplicaciones de escritorio en &lt;b&gt;Python&lt;/b&gt;, &lt;b&gt;Qt&lt;/b&gt; y &lt;b&gt;SQLAlchemy&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;WXPYTHON&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://wiki.wxpython.org/UsingSizers"&gt;Tutorial de sizers&lt;/a&gt;: Tutorial, en inglés, de uso de &lt;b&gt;sizers&lt;/b&gt; (algoritmo de posicionamiento de &lt;b&gt;widgets&lt;/b&gt;) en &lt;b&gt;wxPython&lt;/b&gt;. Muy interesante.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xoomer.virgilio.it/infinity77/index.html"&gt;La web de Andrea Gavanna&lt;/a&gt;: Sitio de &lt;i&gt;Andrea Gavanna&lt;/i&gt;, uno de los desarrolladores de &lt;b&gt;widgets&lt;/b&gt; para &lt;b&gt;wxPython&lt;/b&gt;. Muy buena la sección de software.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oneminutepython.com/"&gt;Python en un minuto&lt;/a&gt;: Blog donde explica muy bien como crear una aplicación &lt;b&gt;wxPython&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;INGENIERÍA DEL SOFTWARE&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.andypatterns.com/"&gt;Web de Andy Bulka&lt;/a&gt;: Software de patrones de diseño y &lt;b&gt;UML&lt;/b&gt;.Cabe destacar la aplicación &lt;b&gt;PyNsource&lt;/b&gt;, que crea un diseño gráfico &lt;b&gt;UML&lt;/b&gt; a partir de código &lt;b&gt;Python&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tigris.org/"&gt;Tigris&lt;/a&gt;: Herramientas de ingeniería del software de código abierto.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://case-tools.org/"&gt;Case Tools&lt;/a&gt;: Sitio web en donde se pueden encontrar cantidad de herramientas &lt;b&gt;CASE&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pymerase.sourceforge.net/"&gt;Pymerase&lt;/a&gt;: Herramienta para diseño de modelo de objetos, en &lt;b&gt;Python&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://modeling-languages.com/es"&gt;Modeling Languages&lt;/a&gt;: Sitio web de analistas, diseñadores y arquitectos de software. Muy interesante e instructivo. En español. Recomendado. Me quedo con la cita del principio de esta página web:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Se supone que el Modelado de Software es una de las actividades más importantes en cualquier proceso de desarrollo del software. Al menos esta es la creencia entre la comunidad científica de ingeniería del software. Sin embargo, en la práctica del día a día la modelización está considerada, básicamente, una pérdida de tiempo.&lt;/i&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large; font-weight: bold;"&gt;SERVICIOS WEB&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://www.tuopcion.com/desarrollo_web/servicios_web/servicios_web_utiles.php"&gt;http://www.tuopcion.com/desarrollo_web/servicios_web/servicios_web_utiles.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.remotemethods.com/"&gt;http://www.remotemethods.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://pywebsvcs.sourceforge.net/"&gt;http://pywebsvcs.sourceforge.net/&lt;/a&gt;&lt;/div&gt;&lt;div style="color: #990000; font-size: x-large; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;IMÁGENES&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://openclipart.org/"&gt;Open Clip Art&lt;/a&gt;: Librería de imágenes libre. Muy buena.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iconspedia.com/"&gt;Icons Pedia&lt;/a&gt;: Librería excepcional de iconos, con varios tamaños. Realmente buena.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.themeworld.com/"&gt;Theme world&lt;/a&gt;: Sitio web sobre temas de escritorio y &lt;i&gt;wallpapers&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;M&lt;/span&gt;ISCELÁNEA&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.jvoegele.com/software/langcomp.html"&gt;Comparativas entre lenguajes de programación&lt;/a&gt;: Artículo muy bueno de &lt;i&gt;Jason Voegele&lt;/i&gt;, sobre una comparativa técnica de los lenguajes de programación actuales, incluido &lt;b&gt;Python&lt;/b&gt;, por supuesto. En inglés.&amp;nbsp;Muy bueno.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://www.packtpub.com/"&gt;Packt Publishing&lt;/a&gt;: Editorial técnica de informática. &lt;b&gt;&lt;a href="https://www.packtpub.com/books/python"&gt;Sección sobre Python&lt;/a&gt;&lt;/b&gt; impresionante. Muy recomendado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://smallbasic.com/"&gt;Small Basic&lt;/a&gt;: Proyecto de &lt;b&gt;Microsoft&lt;/b&gt; para enseñar/aprender a programar. Bastante interesante.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://projecteuler.net/"&gt;Proyecto Euler&lt;/a&gt;: Conjunto de problemas matemáticos, para ser resueltos mediante algoritmos. Se puede utilizar &lt;b&gt;Python&lt;/b&gt; para resolver dichos ejercicios y practicar para aprender. &lt;a href="http://alvarezalonso.es/monobotblog/"&gt;monoBOT&lt;/a&gt; así lo ha hecho (y sigue haciendo). Gracias de nuevo &lt;i&gt;Héctor&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://www.dilandau.com/"&gt;Dilandau&lt;/a&gt;: Búsqueda y descarga (&lt;i&gt;mp3&lt;/i&gt;) de música en Internet.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRDNhjSnARI/AAAAAAAABKY/m6Jk2WzGbe4/s1600/evdn.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRDNhjSnARI/AAAAAAAABKY/m6Jk2WzGbe4/s400/evdn.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Saludos.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-6669131129889143528?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/6669131129889143528/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/recursos-documentales-en-la-red-y-4.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/6669131129889143528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/6669131129889143528'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/recursos-documentales-en-la-red-y-4.html' title='Recursos documentales en la red, y 4'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y_bGxMwbE9g/TRC8bImJUTI/AAAAAAAABKU/_qzCeUre1HA/s72-c/python+perfecto.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8991828585133048136</id><published>2010-12-21T15:06:00.000+01:00</published><updated>2010-12-21T15:06:23.465+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joe'/><category scheme='http://www.blogger.com/atom/ns#' term='jupp'/><title type='text'>JUPP: joe de Linux para Windows</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRB5yNj1vWI/AAAAAAAABJs/cyR8hDTYvWU/s1600/jupp1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="109" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRB5yNj1vWI/AAAAAAAABJs/cyR8hDTYvWU/s640/jupp1.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hola. Como ya he comentado en más de una ocasión, trabajo en entornos &lt;b&gt;Windows XP&lt;/b&gt; (aunque prefiero&lt;b&gt; Linux Ubuntu&lt;/b&gt;). En &lt;i&gt;mi linux&lt;/i&gt;&amp;nbsp;siempre he trabajado con el editor de textos &lt;b&gt;joe&lt;/b&gt;, y en &lt;b&gt;Windows&lt;/b&gt; evidentemente no... sin embargo hace unos meses descubrí &lt;b&gt;JUPP&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.mirbsd.org/jupp.htm"&gt;JUPP&lt;/a&gt; es la versión portable de &lt;b&gt;Joe's Own Editor&lt;/b&gt; (&lt;b&gt;joe&lt;/b&gt;), uno de los editores de texto-ASCII más antiguos de sistemas &lt;b&gt;Linux&lt;/b&gt;. En los tiempos en los que yo programaba en &lt;b&gt;C&lt;/b&gt;, en vez de utilizar &lt;b&gt;Emacs&lt;/b&gt; ó &lt;b&gt;vi&lt;/b&gt;, usaba &lt;b&gt;joe&lt;/b&gt;, sobretodo por la utilización de teclas imitando a &lt;b&gt;WordStar&lt;/b&gt;, un procesador de textos de los años 80 y 90, que sucumbió, como no, a la serie &lt;b&gt;Office&lt;/b&gt; de &lt;b&gt;Microsoft&lt;/b&gt;, como tantos otros (&lt;b&gt;WordPerfect&lt;/b&gt;, etc).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JUPP&lt;/b&gt; es software libre, así que se puede distribuir y modificar bajo los términos de la &lt;b&gt;GNU GPL&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JUPP&lt;/b&gt; (ó &lt;b&gt;joe&lt;/b&gt; para &lt;b&gt;Linux&lt;/b&gt;) es un editor de texto para consola, donde prima mucho la utilización de teclas para operar sobre bloques de texto. Si eres de mi época, seguro que te acuerdas de las guerras entre los procesadores de textos &lt;b&gt;WordStar&lt;/b&gt;, &lt;b&gt;WordPerfect&lt;/b&gt;, un tal &lt;b&gt;Word&lt;/b&gt; que asomaba la cabeza... y todo en un fantástico entorno &lt;b&gt;MS-DOS&lt;/b&gt; (yo utilizaba &lt;b&gt;DR-DOS&lt;/b&gt;, de &lt;b&gt;Digital Research&lt;/b&gt;, adquirido luego por &lt;b&gt;Novell&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JUPP&lt;/b&gt; no es lo ideal para programar, aunque se puede hacer perfectamente (es un editor para programación), no es el ideal para escribir textos y documentación, pero se puede realizar, ... &lt;b&gt;JUPP&lt;/b&gt; e simplemente uno de los editores más fáciles de utilizar, donde prima la rapidez, sin complicaciones.&lt;br /&gt;&lt;br /&gt;En &lt;b&gt;Linux&lt;/b&gt;, solo con invocar &lt;b&gt;joe&lt;/b&gt; ya entramos en el editor. Con las conbinaciones de teclas &lt;span class="Apple-style-span" style="color: #990000;"&gt;Ctrl+K+H&lt;/span&gt; obtenemos la ayuda, que es un cuadro situado arriba de la pantalla. En &lt;b&gt;JUPP&lt;/b&gt;, si quieres que aparezca la ayuda tienes que ejecutar en el intérprete de comandos (&lt;i&gt;cmd.exe&lt;/i&gt;), &lt;b&gt;jupp -help&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRB7DhSTI1I/AAAAAAAABJw/_O8Fj3soCn8/s1600/jupp2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TRB7DhSTI1I/AAAAAAAABJw/_O8Fj3soCn8/s400/jupp2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Como se puede observar, con &lt;b&gt;JUPP&lt;/b&gt; (&lt;b&gt;joe&lt;/b&gt;) podemos operar sobre bloques de código, ir a posiciones a partir del cursor, línea ó fichero , búsqueda, etcétera. Es decir, lo mínimo, utilizando combinaciones de teclas &lt;span class="Apple-style-span" style="color: #990000;"&gt;Ctrl+...&lt;/span&gt;, rápido y sencillo.&lt;br /&gt;&lt;br /&gt;Una de las cosas que tiene realmente buenas &lt;b&gt;JUPP&lt;/b&gt; (&lt;b&gt;joe&lt;/b&gt;) es que es muy configurable, donde podemos cambiar la matoría de los parámetros en su fichero de configuración &lt;b&gt;jupprc&lt;/b&gt;. Más información sobre esto en su ayuda (&lt;i&gt;manpages&lt;/i&gt; en &lt;b&gt;Linux&lt;/b&gt;, y &lt;i&gt;html&lt;/i&gt; en &lt;b&gt;Windows&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRB_BU0pHJI/AAAAAAAABJ0/8YC5ZLaalLI/s1600/jupp3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRB_BU0pHJI/AAAAAAAABJ0/8YC5ZLaalLI/s400/jupp3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;INSTALAR JUPP EN WINDOWS&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En la &lt;a href="https://www.mirbsd.org/jupp.htm"&gt;página web de jupp&lt;/a&gt; podemos encontrar, para entornos &lt;b&gt;Microsoft&lt;/b&gt;, dos versiones, una para &lt;b&gt;MS-DOS&lt;/b&gt; (&lt;i&gt;jupp 2.8&lt;/i&gt;) y otra para &lt;b&gt;Windows&lt;/b&gt; (&lt;i&gt;jupp 3.1&lt;/i&gt;). Si queremos que &lt;b&gt;jupp&lt;/b&gt; reconozca sintaxis &lt;b&gt;Python&lt;/b&gt; tendremos que instalar la versión para &lt;b&gt;Windows&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;En &lt;b&gt;Linux&lt;/b&gt;, &lt;b&gt;joe&lt;/b&gt; funciona perfectamente. En &lt;b&gt;Windows&lt;/b&gt; hay que hacer algunas cosas. Se descarga desde la siguiente URL:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://www.mirbsd.org/jupp.htm"&gt;&lt;b&gt;https://www.mirbsd.org/jupp.htm&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Nos vamos a la etiqueta &lt;b&gt;Binaries&lt;/b&gt;, en el punto &lt;b&gt;jupp 3.x for Unix&lt;/b&gt;, sección &lt;b&gt;JOE 3.1jupp14 for Windows&lt;/b&gt;. Descargamos el fichero &lt;b&gt;JWIN31E.EXE&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCnVsEsCLI/AAAAAAAABJ4/-XtaMlENyBs/s1600/jupp_ins1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCnVsEsCLI/AAAAAAAABJ4/-XtaMlENyBs/s640/jupp_ins1.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lo ejecutamos, y se descomprime el ejecutable en una carpeta JWIN31.EXE:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCoR4WQQAI/AAAAAAAABJ8/JCRn4JoTn70/s1600/jupp_ins2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="552" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCoR4WQQAI/AAAAAAAABJ8/JCRn4JoTn70/s640/jupp_ins2.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Nos ponemos encima del fichero &lt;b&gt;SETUP.INF&lt;/b&gt;, botón derecho y seleccionamos del menú emergente &lt;b&gt;Instalar&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCppkfs6bI/AAAAAAAABKA/EmruyeRYSno/s1600/jupp_ins3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCppkfs6bI/AAAAAAAABKA/EmruyeRYSno/s320/jupp_ins3.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El programa se instala en &lt;b&gt;C:\WINDOWS\system32\joe&lt;/b&gt;. Para ejecutarlo hay que ir al intérprete de comandos (cmd.exe) y escribir jupp32.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRCv2dHOD-I/AAAAAAAABKE/YKD1qDP_c94/s1600/jupp_ins4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="321" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TRCv2dHOD-I/AAAAAAAABKE/YKD1qDP_c94/s640/jupp_ins4.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Esta versión de &lt;b&gt;jupp&lt;/b&gt; soporta sintaxis &lt;b&gt;Python&lt;/b&gt;, que está en un &lt;i&gt;fichero de configuración joe&lt;/i&gt; (&lt;b&gt;JFS&lt;/b&gt;), y que se puede encontrar en&amp;nbsp;&lt;b&gt;C:\WINDOWS\system32\joe\syntax\python.jfs&lt;/b&gt;. Se puede modificar dicho fichero. Por ejemplo, si se dispone de una versión &lt;b&gt;Python&lt;/b&gt; con palabras clave nuevas, se pueden agregar.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCxKIQGQpI/AAAAAAAABKI/WGRE715Gj-U/s1600/jupp_ins5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCxKIQGQpI/AAAAAAAABKI/WGRE715Gj-U/s1600/jupp_ins5.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;También se puede cambiar tanto la indentación, como la codificación &amp;nbsp;y otros valores&amp;nbsp;en el fichero&amp;nbsp;de configuración &lt;b&gt;jupp32rc&lt;/b&gt;, en la sección de &lt;b&gt;Python&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRCzTZhPvvI/AAAAAAAABKQ/JRWYCRgkGaQ/s1600/jupp_ins7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TRCzTZhPvvI/AAAAAAAABKQ/JRWYCRgkGaQ/s1600/jupp_ins7.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;NOTA&lt;/span&gt;&lt;/b&gt;: Si se te da el caso que trabajando con ficheros &lt;b&gt;.py&lt;/b&gt; no puedes escribir acentos, eñes y demás caracteres latinos, prueba a cambiar la codificación en &lt;b&gt;jupp32rc&lt;/b&gt;, cambiando &lt;b&gt;utf8&lt;/b&gt; por &lt;b&gt;iso8859&lt;/b&gt;, tal que así:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCxtiCP_uI/AAAAAAAABKM/-vJmhPk1ybM/s1600/jupp_ins6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TRCxtiCP_uI/AAAAAAAABKM/-vJmhPk1ybM/s1600/jupp_ins6.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: large;"&gt;...resumiendo&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Gracias a&amp;nbsp;&lt;b&gt;Joseph H. Allen&lt;/b&gt;&amp;nbsp;por este programa, tan pequeño, con el que se pueden hacer cosas tan grandes.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;i&gt;La nostalgia y los buenos recuerdos programando en este editor me han hecho escribir este post.&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8991828585133048136?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8991828585133048136/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/jupp-joe-de-linux-para-windows.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8991828585133048136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8991828585133048136'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/jupp-joe-de-linux-para-windows.html' title='JUPP: joe de Linux para Windows'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y_bGxMwbE9g/TRB5yNj1vWI/AAAAAAAABJs/cyR8hDTYvWU/s72-c/jupp1.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-693662297170902623</id><published>2010-12-18T13:39:00.001+01:00</published><updated>2010-12-18T13:45:51.011+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Palabras clave y funciones integradas en Python</title><content type='html'>Si queremos saber las palabras clave que tiene nuestra versión actual de&lt;b&gt; Python&lt;/b&gt; podemos acceder al módulo&amp;nbsp;&lt;b&gt;keyword&lt;/b&gt;, el cual recoge dicho conjunto de vocablos. Tal que así:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import keyword&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;print "Palabras clave", keyword.kwlist&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si nos ponemos algo más &lt;i&gt;puntillosos&lt;/i&gt;, podemos mejorar la presentación, bien utilizando el módulo &lt;b&gt;pprint&lt;/b&gt;, ó creando una presentación por columnas, tal que así:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;import keyword&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;tab = '\t'&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;enter = '\n'&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;contador = 0&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;cadena = ''&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;for i in keyword.kwlist:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cadena += i + tab&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if contador == 5:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contador = 0&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cadena += enter&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contador += 1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;print cadena&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Devolviendo las palabras clave (versión &lt;b&gt;2.6.6&lt;/b&gt;):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQypQTPdEZI/AAAAAAAABJo/hQcOHWq6kWY/s1600/palabras_clave_python26.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQypQTPdEZI/AAAAAAAABJo/hQcOHWq6kWY/s1600/palabras_clave_python26.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;b&gt;Python&lt;/b&gt; trae consigo ciertas funciones que vienen &lt;span class="Apple-style-span" style="color: #990000;"&gt;de serie&lt;/span&gt;, esto es, no es necesario cargarlas desde ningún módulo, como &lt;b&gt;raw_input&lt;/b&gt; ó &lt;b&gt;abs&lt;/b&gt;. Dichas funciones dependen de la versión &lt;b&gt;Python&lt;/b&gt; que tengamos instalada en nuestro sistema. Podemos encontrar (en perfecto inglés) las &lt;u style="font-style: italic; font-weight: bold;"&gt;built-in Functions&lt;/u&gt; en:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://docs.python.org/library/functions.html"&gt;http://docs.python.org/library/functions.html&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Aprender tanto las &lt;b&gt;funciones integradas&lt;/b&gt; como las &lt;b&gt;palabras clave&lt;/b&gt; en &lt;b&gt;Python&lt;/b&gt; es importante.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Saludos.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-693662297170902623?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/693662297170902623/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/palabras-clave-y-funciones-integradas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/693662297170902623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/693662297170902623'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/palabras-clave-y-funciones-integradas.html' title='Palabras clave y funciones integradas en Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y_bGxMwbE9g/TQypQTPdEZI/AAAAAAAABJo/hQcOHWq6kWY/s72-c/palabras_clave_python26.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4206556781945578100</id><published>2010-12-17T21:07:00.001+01:00</published><updated>2010-12-17T21:12:25.510+01:00</updated><title type='text'>Certificación en Python</title><content type='html'>Hola. Hoy he leído en el blog de &lt;b&gt;Mike Driscoll&lt;/b&gt; (&lt;a href="http://www.blog.pythonlibrary.org/"&gt;http://www.blog.pythonlibrary.org/&lt;/a&gt;), gurú de &lt;b&gt;Python&lt;/b&gt;, un artículo (&lt;a href="http://www.blog.pythonlibrary.org/2010/12/14/the-new-python-certificate/"&gt;http://www.blog.pythonlibrary.org/2010/12/14/the-new-python-certificate/&lt;/a&gt;)&amp;nbsp;muy interesante sobre un programa de certificación en &lt;b&gt;Python&lt;/b&gt;, por la &lt;i&gt;Universidad de Illinois&lt;/i&gt; (EEUU). Evidentemente a los navegantes de la península nos queda algo "retirado", incluso a nuestros hermanos de América del Sur. El artículo está en inglés, pero os recomiendo su lectura.&lt;br /&gt;&lt;br /&gt;Un paso hacia la certificación en &lt;b&gt;Python&lt;/b&gt;. Ojalá instituciones (universidades, por ejemplo) nacionales ó empresas de nivel mundial ( ...mmm, ¿Google?) creasen este tipo de certificaciones.&lt;br /&gt;&lt;br /&gt;Más información en&amp;nbsp;&lt;a href="http://www.oreillyschool.com/certificates/python-programming.php"&gt;http://www.oreillyschool.com/certificates/python-programming.php&lt;/a&gt;.&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4206556781945578100?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4206556781945578100/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/certificacion-en-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4206556781945578100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4206556781945578100'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/certificacion-en-python.html' title='Certificación en Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-5805683136361498286</id><published>2010-12-13T11:21:00.000+01:00</published><updated>2010-12-13T11:21:36.408+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='documentación software libre'/><title type='text'>Área de descargas de El Viaje del Navegante</title><content type='html'>Hola. Me he dado cuenta que cada vez que escribo un &lt;b&gt;post&lt;/b&gt; que contiene mucho código no suele ser una buena idea, ya que el lector tiende a no leerlo (yo tampoco lo haría). Es por ello que conforme vaya escribiendo artículos de aplicaciones sencillas, colgaré el código generado (&lt;i&gt;&lt;b&gt;zip&lt;/b&gt; con ficheros &lt;b&gt;.py&lt;/b&gt;&lt;/i&gt;) de los ejemplos en la siguiente dirección web:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/codigo" style="color: #992211; text-decoration: none;"&gt;https://sites.google.com/site/elviajedelnavegante/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Voy a intentar colgar todo el código posible. A día de hoy tenéis en la sección de &lt;u style="font-style: italic; font-weight: bold;"&gt;código&lt;/u&gt;, un ejemplo del &lt;b&gt;FoldPanelBar&lt;/b&gt; y &lt;b&gt;wxFormBuilder&lt;/b&gt; del artículo&amp;nbsp;&lt;a href="http://elviajedelnavegante.blogspot.com/2010/12/wxpython-disenar-un-mantenimiento-con.html"&gt;http://elviajedelnavegante.blogspot.com/2010/12/wxpython-disenar-un-mantenimiento-con.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Además colgaré &lt;b&gt;documentación &lt;/b&gt;referida a &lt;b&gt;Python&lt;/b&gt; en la sección de &lt;b&gt;&lt;i&gt;&lt;u&gt;documentación&lt;/u&gt;&lt;/i&gt;&lt;/b&gt; (a día de hoy está la presentación en &lt;b&gt;PDF&lt;/b&gt; de&lt;b&gt; Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;Una última cosa... Yo normalmente comento abundantemente el código que diseño ó escribo (&lt;i&gt;¡el motivo fundamental es que tengo memoria de &lt;span class="Apple-style-span" style="color: #38761d;"&gt;pez&lt;/span&gt;, se me olvida!&lt;/i&gt;), por lo que bajar los ficheros no solamente es para verificar que funciona, sino para una guía de cómo llegar al resultado. Esta técnica es fundamental para aprender. Es más, yo aprendo &lt;b&gt;Python&lt;/b&gt; de ejemplos que comentan otros autores, modificando dicho código e indagando en la cuestión.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-5805683136361498286?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/5805683136361498286/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/area-de-descargas-de-el-viaje-del.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5805683136361498286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5805683136361498286'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/area-de-descargas-de-el-viaje-del.html' title='Área de descargas de El Viaje del Navegante'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4916402258271237905</id><published>2010-12-11T20:59:00.002+01:00</published><updated>2010-12-11T21:27:43.956+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='foldpanelbar'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><category scheme='http://www.blogger.com/atom/ns#' term='wxFormBuilder'/><title type='text'>wxPython: Diseñar un mantenimiento con FoldPanelBar y wxFormBuilder</title><content type='html'>Hola. En este artículo vamos a ver como diseñar un mantenimiento sofisticado en &lt;b&gt;wxPython&lt;/b&gt;, con la ayuda del componente de &lt;b&gt;wxPython&lt;/b&gt;, el &lt;b&gt;FoldPanelBar&lt;/b&gt;, y el diseñador &lt;b&gt;wxFormBuilder&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;¿Qué es un &lt;b&gt;FoldPanelBar&lt;/b&gt;? Es un conjunto de paneles colapsables, para presentar la información en un &lt;b&gt;Frame&lt;/b&gt; de manera parcial, activando y desactivando paneles colapsables. Es lo más parecido a &lt;b&gt;wx.CollapsiblePane&lt;/b&gt;, pero en vez de un panel puede haber varios. Tenéis un ejemplo completo en el &lt;b&gt;wxPython 2.8 Docs Demos and Tools&lt;/b&gt;, que se puede obtener de&amp;nbsp;&lt;a href="http://www.wxpython.org/download.php#stable"&gt;http://www.wxpython.org/download.php#stable&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIzASXmfvI/AAAAAAAABIA/DfeQZXiDySI/s1600/wxpython_logo.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIzASXmfvI/AAAAAAAABIA/DfeQZXiDySI/s200/wxpython_logo.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIzFF61yBI/AAAAAAAABII/-G72kz3pSP0/s1600/foldpanelbar1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIzFF61yBI/AAAAAAAABII/-G72kz3pSP0/s400/foldpanelbar1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIzFsGXPlI/AAAAAAAABIM/L_7_heolIBM/s1600/foldpanelbar2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIzFsGXPlI/AAAAAAAABIM/L_7_heolIBM/s400/foldpanelbar2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQIzEAlojYI/AAAAAAAABIE/j0YeYZURblQ/s1600/foldpanelbar4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQIzEAlojYI/AAAAAAAABIE/j0YeYZURblQ/s400/foldpanelbar4.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIzGUepweI/AAAAAAAABIQ/YCztc4eBZzk/s1600/foldpanelbar3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIzGUepweI/AAAAAAAABIQ/YCztc4eBZzk/s400/foldpanelbar3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Como podemos ver este componente está dentro de un &lt;b&gt;SplitterWindow&lt;/b&gt;, que es un &lt;b&gt;Frame &lt;/b&gt;que se puede dividir en zonas, tal como se ve en la imagen. La cuestión es hacer un mantenimiento de datos, que utilice dicho componente de paneles colapsables. El diseño del &lt;b&gt;FoldPanelBar&lt;/b&gt; se hará en base al código que está disponible en la documentación de &lt;b&gt;wxPython&lt;/b&gt;. Lo único que nos falta es diseñar el contenido de los paneles colapsables. Para ello vamos a utilizar &lt;b&gt;wxFormBuilder&lt;/b&gt;. ¿Cómo? Pues diseñando cada panel según los datos que queremos que aparezcan. Esto lo podemos resumir en el siguiente gráfico:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQI4xM42cTI/AAAAAAAABIU/GxOrZh99Zrs/s1600/EXPLICACION_FOLD_PANEL_BAR_Y_WXFORMBUILDER.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQI4xM42cTI/AAAAAAAABIU/GxOrZh99Zrs/s400/EXPLICACION_FOLD_PANEL_BAR_Y_WXFORMBUILDER.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Con &lt;b&gt;wxFormBuilder&lt;/b&gt; vamos a construir gráficamente todos los paneles necesarios, cuya sintaxis &lt;b&gt;Python &lt;/b&gt;generada se guardará en el fichero &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios.py&lt;/span&gt;. En el fichero &lt;span class="Apple-style-span" style="color: #990000;"&gt;vista_usuarios.py&lt;/span&gt; crearemos una instancia del componente &lt;b&gt;FoldPanelBar&lt;/b&gt; e importaremos los paneles creados que están en el fichero &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios.py&lt;/span&gt;. Una vez realizado esto, simplemente incluiremos los paneles en su lugar correspondiente dentro del &lt;b&gt;FoldPanelBar&lt;/b&gt;, ...y ¡listo!, ya lo tendremos todo hecho.&lt;br /&gt;&lt;br /&gt;¿Por qué así? ¿Por qué no crear el &lt;b&gt;FoldPanelBar&lt;/b&gt; dentro de &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios.py&lt;/span&gt;? Pues por la sencilla razón que si queremos cambiar en &lt;b&gt;wxFormBuilder &lt;/b&gt;algo y volvemos a generar el código cabe la posibilidad de eliminar las modificaciones pertinentes. Además, trabajar con herencia es algo fundamental en el diseño de aplicaciones&lt;b&gt; wxPython&lt;/b&gt;, ya que nos ahorramos código y tiempo. Es decir, podemos volver a generar el código en el diseñador, sin tocar otras partes que ya están hechas y funcionan.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTA&lt;/b&gt;:&amp;nbsp;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Vamos a crear un mantenimiento de gestión de usuarios de una aplicación genérica.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: x-large;"&gt;&lt;b&gt;wxFormBuilder&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo primero de todo es crear un proyecto. Después se especifica el fichero que contendrá el código &lt;b&gt;Python&lt;/b&gt; generado, y a continuación, ¡¡¡a diseñar!!!.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQI8Mf5gBaI/AAAAAAAABIY/juPiQlhVX80/s1600/wxformbuilder1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQI8Mf5gBaI/AAAAAAAABIY/juPiQlhVX80/s400/wxformbuilder1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Como podemos observar en el árbol de objetos (&lt;b&gt;Object Tree&lt;/b&gt;), nuestro diseño se basa en un &lt;b&gt;Frame&lt;/b&gt;, barra de menú, un menú y una serie de paneles, que contienen cada uno de ellos más &lt;b&gt;widgets&lt;/b&gt; (botones, cajas de texto, etc.), todos ellos dispuestos posicionalmente mediante &lt;b&gt;Sizers&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQI-VlJEAbI/AAAAAAAABIc/U-6cqy50i0M/s1600/wxformbuilder2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQI-VlJEAbI/AAAAAAAABIc/U-6cqy50i0M/s1600/wxformbuilder2.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A continuación, diversas capturas de pantalla del diseño de paneles y demás widgets:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQJBkOZ3IqI/AAAAAAAABJI/Pthov_n2ED0/s1600/wxformbuilder9.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQJBkOZ3IqI/AAAAAAAABJI/Pthov_n2ED0/s400/wxformbuilder9.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQJAIdLsdvI/AAAAAAAABIg/DRQJd61Jvl8/s1600/wxformbuilder8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQJAIdLsdvI/AAAAAAAABIg/DRQJd61Jvl8/s400/wxformbuilder8.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQJALCpnfQI/AAAAAAAABIo/cvfoww0xU2I/s1600/wxformbuilder3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQJALCpnfQI/AAAAAAAABIo/cvfoww0xU2I/s400/wxformbuilder3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQJAMU2VGII/AAAAAAAABIs/i52Yv9aRGQE/s1600/wxformbuilder4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQJAMU2VGII/AAAAAAAABIs/i52Yv9aRGQE/s400/wxformbuilder4.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQJANS-sfrI/AAAAAAAABIw/ni-5V8li4I8/s1600/wxformbuilder5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQJANS-sfrI/AAAAAAAABIw/ni-5V8li4I8/s400/wxformbuilder5.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQJAO9XKQ0I/AAAAAAAABI0/G3u2ytP3qdA/s1600/wxformbuilder6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQJAO9XKQ0I/AAAAAAAABI0/G3u2ytP3qdA/s400/wxformbuilder6.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQJAQB1DPiI/AAAAAAAABI4/0zGGF41LGJI/s1600/wxformbuilder7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQJAQB1DPiI/AAAAAAAABI4/0zGGF41LGJI/s400/wxformbuilder7.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;b&gt;NOTA&lt;/b&gt;: Los iconos que aparecen en el menú de herramientas los he bajado de&amp;nbsp;&lt;a href="http://www.iconspedia.com/"&gt;http://www.iconspedia.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTA2&lt;/b&gt;: Como podéis observar en la imagen hay un panel llamado &lt;i&gt;PanelUsuario&lt;/i&gt;. A este panel no hay que hacerle caso, es una prueba que realicé y se me ha colado ahí. Disculpadme.&lt;br /&gt;&lt;br /&gt;Una vez realizados todos los diseños de los paneles, frames y menús se genera el código &lt;b&gt;Python&lt;/b&gt;, guardándose en el fichero especificado en el proyecto, &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios.py&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: x-large;"&gt;&lt;b&gt;Heredando el diseño...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, ya tenemos prácticamente terminado nuestro viaje. Únicamente nos falta crear una clase que instancie el componente &lt;b&gt;FoldPanelBar&lt;/b&gt; de &lt;b&gt;wxPython&lt;/b&gt;, e incluir los paneles generados por &lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;en su sitio. Aunque al lector le parezca un trabajo en exceso o demasiado enrevesado, en realidad no lo es... es más, es la mejor forma de cambiar código con la mínima repercusión. El contenido del fichero &lt;span class="Apple-style-span" style="color: #990000;"&gt;vista_usuarios.py&lt;/span&gt; es el siguiente:&lt;br /&gt;&lt;br /&gt;import &lt;span class="Apple-style-span" style="color: blue;"&gt;wx&lt;/span&gt;&lt;br /&gt;import &lt;span class="Apple-style-span" style="color: blue;"&gt;wx.lib.agw.foldpanelbar&lt;/span&gt; as fpb&lt;br /&gt;from &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios &lt;/span&gt;import FrameGenerico, BarraMenuGenericoPersona&lt;br /&gt;from &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios&lt;/span&gt; import MenuGenerico, PanelUsuarioNick&lt;br /&gt;from &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios&lt;/span&gt; import PanelUsuarioLocalizacion, PanelUsuarioExtra&lt;br /&gt;from &lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios&lt;/span&gt; import PanelUsuarioPersona&lt;br /&gt;&lt;br /&gt;class frame_usuario(FrameGenerico):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;# Llamamos al constructor del FrameGenerico.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FrameGenerico.__init__(self, None )&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Incluimos título al frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FrameGenerico.SetTitle(self, u"Gestión de usuarios")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Creamos una barra de herramientas en el frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.SetToolBar(BarraMenuGenericoPersona(self))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;# Creamos menú generico.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;menu = MenuGenerico()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# E incluimos dicho menú en el frame.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.SetMenuBar(menu)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;# Creamos un Fold Panel Bar.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.panel = fpb.FoldPanelBar(self, wx.ID_ANY, wx.DefaultPosition,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wx.DefaultSize, agwStyle=fpb.FPB_VERTICAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Creamos subpanel de datos de identificación del usuario.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;subpanel = self.panel.AddFoldPanel(u"Identificación", collapsed=False)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Incluimos panel de nick, foto y contraseña de usuario.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel = PanelUsuarioNick(subpanel)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.panel.AddFoldPanelWindow(subpanel, panel, fpb.FPB_ALIGN_WIDTH)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Creamos subpanel de datos personales del usuario.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;subpanel = self.panel.AddFoldPanel(u"Datos personales", collapsed=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Incluimos panel de datos personales.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel = PanelUsuarioPersona(subpanel)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.panel.AddFoldPanelWindow(subpanel, panel, fpb.FPB_ALIGN_WIDTH)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;# Creamos subpanel de datos de localización del usuario.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;subpanel = self.panel.AddFoldPanel(u"Dirección", collapsed=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;# Incluimos panel de dirección personal.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel = PanelUsuarioLocalizacion(subpanel)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.panel.AddFoldPanelWindow(subpanel, panel, fpb.FPB_ALIGN_WIDTH)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;# Creamos subpanel para datos extra.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;subpanel = self.panel.AddFoldPanel(u"Teléfono y correo electrónico",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collapsed=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt; &amp;nbsp;# Incluimos panel de teléfonos y correos electrónicos.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel = PanelUsuarioExtra(subpanel)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.panel.AddFoldPanelWindow(subpanel, panel, fpb.FPB_ALIGN_WIDTH)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;# Lanzamos aplicación.&lt;/span&gt;&lt;br /&gt;aplicacion = wx.PySimpleApp()&lt;br /&gt;frame_usuario = frame_usuario()&lt;br /&gt;frame_usuario.Show()&lt;br /&gt;aplicacion.MainLoop()&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y listo!!!! Con solo ejecutar &lt;i&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;b&gt;python vista_usuarios.py&lt;/b&gt;&lt;/span&gt;&lt;/i&gt; ya tenemos nuestro diseño de mantenimiento de gestión de usuarios genérico. Darse cuenta de las pocas líneas de código que hemos tenido que escribir, ya que la mayoría del trabajo ha sido diseñado en &lt;b&gt;wxFormBuilder&lt;/b&gt;, generándose el código &lt;b&gt;Python&lt;/b&gt; automáticamente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000; font-size: x-large;"&gt;wxPython: FoldPanelBar&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQPCis6rKEI/AAAAAAAABJQ/0Plb1GvYZD8/s1600/fpb1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQPCis6rKEI/AAAAAAAABJQ/0Plb1GvYZD8/s320/fpb1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQPCh6fa2tI/AAAAAAAABJM/3KEQCDKJx7U/s1600/fpb6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQPCh6fa2tI/AAAAAAAABJM/3KEQCDKJx7U/s320/fpb6.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQPCjFL9FeI/AAAAAAAABJU/k6HBgNw-UBo/s1600/fpb2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQPCjFL9FeI/AAAAAAAABJU/k6HBgNw-UBo/s320/fpb2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQPCjzaiklI/AAAAAAAABJY/Rx5AYM4EYZ4/s1600/fpb3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQPCjzaiklI/AAAAAAAABJY/Rx5AYM4EYZ4/s320/fpb3.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQPCkV5-D7I/AAAAAAAABJc/-rZveUBFaMw/s1600/fpb4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQPCkV5-D7I/AAAAAAAABJc/-rZveUBFaMw/s320/fpb4.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQPCkzDIFjI/AAAAAAAABJg/tYXl3E3fS-I/s1600/fpb5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQPCkzDIFjI/AAAAAAAABJg/tYXl3E3fS-I/s320/fpb5.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como se puede observar hemos creado un mantenimiento bastante "moderno" con un componente, el &lt;b&gt;FoldPanelBar&lt;/b&gt;, que nos da bastante juego en la presentación de datos, ofreciendo &lt;i&gt;&lt;u&gt;más por menos&lt;/u&gt;&lt;/i&gt;. Los paneles, diseñados con &lt;b&gt;wxFormBuilder&lt;/b&gt;, contienen todos los widgets mínimos necesarios, dispuestos con &lt;b&gt;sizers &lt;/b&gt;(&lt;b&gt;BoxSizer&lt;/b&gt; y &lt;b&gt;FlexGridSizer&lt;/b&gt;). Trabajar con &lt;b&gt;sizers&lt;/b&gt; nos ahorra tiempo... con&lt;b&gt; wxFormBuilder&lt;/b&gt; es un juego, os lo aseguro.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Todo el código, tanto del proyecto&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;(&lt;span class="Apple-style-span" style="color: #990000;"&gt;usuarios.fbp&lt;/span&gt;), como los ficheros&amp;nbsp;&lt;b&gt;Python&lt;/b&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;design_vista_usuarios.py&lt;/span&gt;&amp;nbsp;(código generado por&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;) y&amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;vista_usuarios.py&lt;/span&gt;&amp;nbsp;los podéis encontrar en un&lt;b&gt;&amp;nbsp;ZIP&lt;/b&gt;,&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;FoldPanelBar.zip&lt;/span&gt;&lt;/b&gt;,en el repositorio de este blog:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/codigo"&gt;https://sites.google.com/site/elviajedelnavegante/codigo&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;Una pequeña observación... ó dos...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;está disponible tanto para&amp;nbsp;&lt;b&gt;Windows&lt;/b&gt;,&amp;nbsp;&lt;b&gt;Linux&lt;/b&gt;&amp;nbsp;como&amp;nbsp;&lt;b&gt;Mac&lt;/b&gt;. La versión con la que yo trabajo de&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;es&amp;nbsp;&lt;b&gt;3.1.70&lt;/b&gt;. Os lo digo por si intentáis abrir el fichero del proyecto y os dice que&amp;nbsp;&lt;i&gt;nada de nada&lt;/i&gt;. En&amp;nbsp;&lt;b&gt;Ubuntu Lucid&lt;/b&gt;&amp;nbsp;la versión disponible es la&amp;nbsp;&lt;b&gt;3.1.59-beta&lt;/b&gt;, con lo que necesitaréis instalaros desde su web la más reciente.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;No está mal recordar que el proyecto de&amp;nbsp;&lt;b&gt;wxFormBuilder&lt;/b&gt;&amp;nbsp;genera un fichero&amp;nbsp;&lt;b&gt;.py&lt;/b&gt;&amp;nbsp;específico en una ruta determinada. Es decir, si quieres volver a generar el código&lt;b&gt;&amp;nbsp;Python&lt;/b&gt;&amp;nbsp;del diseño no estaría mal cambiar la ruta donde tengas tu fichero .py.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQPXDwkq6hI/AAAAAAAABJk/nBT_5o1eYvo/s1600/wxformbuilder0.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQPXDwkq6hI/AAAAAAAABJk/nBT_5o1eYvo/s400/wxformbuilder0.JPG" style="cursor: move;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Espero pueda serviros. Saludos.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4916402258271237905?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4916402258271237905/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/wxpython-disenar-un-mantenimiento-con.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4916402258271237905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4916402258271237905'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/wxpython-disenar-un-mantenimiento-con.html' title='wxPython: Diseñar un mantenimiento con FoldPanelBar y wxFormBuilder'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIzASXmfvI/AAAAAAAABIA/DfeQZXiDySI/s72-c/wxpython_logo.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4723321474328263176</id><published>2010-12-10T12:41:00.001+01:00</published><updated>2010-12-10T12:50:04.524+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='herencia múltiple'/><title type='text'>Herencia múltiple en Python, ¡el orden importa!</title><content type='html'>Hola. En este artículo vamos a ver la importancia de definir bien la &lt;b&gt;herencia múltiple&lt;/b&gt;, esto es, el orden en el cual se llama a los constructores (&lt;b&gt;__init__&lt;/b&gt;, que no es el constructor, aunque sí es el sitio donde escribiremos el código que ejecutaría el constructor) de las clases heredadas, ya que es fundamental, así como la importancia de nombrar bien a los atributos, para que no se sobreescriban (&lt;b&gt;override&lt;/b&gt;); en &lt;b&gt;Python&lt;/b&gt; no hay polimorfismo entendido como sobrecarga de métodos, aunque hay maneras de emularlo.&lt;br /&gt;&lt;br /&gt;NOTA: Si se quiere entender con más profundidad como &lt;b&gt;Python&lt;/b&gt; resuelve el tema de la &lt;b&gt;herencia múltiple&lt;/b&gt; aconsejo que miréis el tema de &lt;b&gt;MRO&lt;/b&gt; en&amp;nbsp;&lt;a href="http://www.python.org/download/releases/2.3/mro/"&gt;http://www.python.org/download/releases/2.3/mro/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Comenzamos...&lt;br /&gt;&lt;br /&gt;Imaginemos que declaramos dos clases que heredan de &lt;b&gt;object&lt;/b&gt;: &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;. Creamos una tercera clase, &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;clase3&lt;/b&gt;&lt;/span&gt;, que hereda de &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;. Tal como aparece en la imagen de abajo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIErU7fcjI/AAAAAAAABHU/wLov540LfXs/s1600/herencia_multiple_python.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIErU7fcjI/AAAAAAAABHU/wLov540LfXs/s400/herencia_multiple_python.JPG" width="377" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Al instanciar la &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3 &lt;/span&gt;&lt;/b&gt;vemos que ha heredado los métodos de las clases&lt;span class="Apple-style-span" style="color: #990000;"&gt; clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2 &lt;/span&gt;pero únicamente el atributo de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt;. ¿Por qué? Si nos damos cuenta en la &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt; no hemos llamado a ningún constructor, esto es, hacemos &lt;b&gt;pass&lt;/b&gt;, por tanto &lt;b&gt;Python&lt;/b&gt; resuelve por el orden en el que se ha declarado la herencia múltiple en &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt;, es decir &lt;b&gt;class clase3(clase1, clase2)&lt;/b&gt;. Obtiene el atributo de la primera clase que se encuentra de izquierda a derecha, esto es, &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt;.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Ahora si en el constructor de la &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;clase3&lt;/b&gt;&lt;/span&gt; llamamos a los constructores de las clases &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt; tenemos que:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIEsJcwPcI/AAAAAAAABHY/BBDH98ooz1A/s1600/herencia_multiple_python2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIEsJcwPcI/AAAAAAAABHY/BBDH98ooz1A/s400/herencia_multiple_python2.JPG" width="377" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt; hereda tanto los métodos como los atributos de las clases &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;. Esto es lo que esperábamos.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Ahora lo que vamos a hacer es renombrar los atributos de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt; con el mismo nombre, es decir, van a tener un atributo cada una de las dos clases, que se va a llamar "&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;atributo&lt;/span&gt;". Mira lo que pasa ahora:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIEs3baCTI/AAAAAAAABHc/_I6yXOmRnzk/s1600/herencia_multiple_python3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQIEs3baCTI/AAAAAAAABHc/_I6yXOmRnzk/s400/herencia_multiple_python3.JPG" width="377" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;¡Vaya! ¿&lt;b&gt;Python&lt;/b&gt; no sabe distinguir entre dos atributos con el mismo nombre? La respuesta es que no sabe. ¿Y cual elige? Pues el atributo que sea el último en inicializarse. Como &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt;&amp;nbsp;la hemos inicializado primero con el &amp;nbsp;constructor de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y por último con el de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;, será el atributo de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt; el que existirá (esto es, hace un override al atributo de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt;). Hacemos la prueba llamando a los métodos que nos devuelvan el valor de los atributos de las clases:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIEqqR7kXI/AAAAAAAABHQ/8KLe17NckT0/s1600/herencia_multiple_python4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIEqqR7kXI/AAAAAAAABHQ/8KLe17NckT0/s400/herencia_multiple_python4.JPG" width="391" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Y tenemos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIMJWZRRKI/AAAAAAAABHg/4pJK47xfnx0/s1600/herencia_multiple_python5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIMJWZRRKI/AAAAAAAABHg/4pJK47xfnx0/s400/herencia_multiple_python5.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Es decir, el método &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;devolver_atributo2()&lt;/span&gt; hace lo correcto, pero el método &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;devolver_atributo1()&lt;/span&gt; lo que hace es devolver el atributo que está inicializado, esto es, el que se inicializó el último, es decir, el de la clase &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;. ¡Vaya! ¡Parece un lío, pero no lo es! Si lo piensas bien tiene su lógica (aunque no tanto su gracia).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿No me crees? Vamos a hacerlo al revés. Ahora vamos a llamar a los constructores de la &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt; cambiando el orden, de manera que ahora llamamos primero al constructor de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt; y por último al constructor de la &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt;. Mira lo que pasa:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQINV91Ze3I/AAAAAAAABHo/m1_iYPiZkqw/s1600/herencia_multiple_python6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQINV91Ze3I/AAAAAAAABHo/m1_iYPiZkqw/s400/herencia_multiple_python6.JPG" width="391" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Y tenemos que:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQINVImpwqI/AAAAAAAABHk/1KTeRia8A3U/s1600/herencia_multiple_python7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="68" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQINVImpwqI/AAAAAAAABHk/1KTeRia8A3U/s640/herencia_multiple_python7.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;...como cabría esperar.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tan solo con nombrar bien a los atributos de las clases heredadas todo funciona a las mil maravillas:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIOIvodDsI/AAAAAAAABHw/42Mc421551Q/s1600/herencia_multiple_python8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIOIvodDsI/AAAAAAAABHw/42Mc421551Q/s400/herencia_multiple_python8.JPG" width="391" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Y el resultado es:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQIOHwktmfI/AAAAAAAABHs/fwGL9NDYQ6A/s1600/herencia_multiple_python9.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="70" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQIOHwktmfI/AAAAAAAABHs/fwGL9NDYQ6A/s640/herencia_multiple_python9.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vamos a ver un último caso. Creamos una tercera clase, llamada &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase25&lt;/span&gt;, que también hereda de &lt;b&gt;object&lt;/b&gt;, y vamos a modificar &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt;, que ahora va a heredar de &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase25&lt;/span&gt;, &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;. Todo queda como sigue:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIPaRpdaNI/AAAAAAAABH0/l26a0RhghoM/s1600/herencia_multiple_python10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIPaRpdaNI/AAAAAAAABH0/l26a0RhghoM/s400/herencia_multiple_python10.JPG" width="378" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como vemos todo es normal; &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt; hereda tanto métodos como atributos. Pero... ¿y si cambiamos la forma en la que heredan las clases? Vamos a declarar que ahora &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase25&lt;/span&gt; hereda de &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt; y que &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;clase3&lt;/b&gt;&lt;/span&gt; ahora solo hereda de &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase25&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase1&lt;/span&gt;. ¡PUFF! ¡Vaya comida de cabeza!. Mira la siguiente imagen:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIQs1IaapI/AAAAAAAABH4/CBIrTHDkDdM/s1600/herencia_multiple_python11.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TQIQs1IaapI/AAAAAAAABH4/CBIrTHDkDdM/s400/herencia_multiple_python11.JPG" width="373" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;¿Ein?&lt;/u&gt;&lt;/i&gt;&lt;/b&gt; El lector, si ha entendido (que seguro que sí) lo expuesto en este post debe saber porqué no aparece el &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;atributo2&lt;/span&gt; si la clase &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase25&lt;/span&gt; hereda de&lt;span class="Apple-style-span" style="color: #990000;"&gt; clase2&lt;/span&gt;, que contiene dicho atributo. Evidentemente, porque en el constructor de la clase &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase25&lt;/span&gt; no se ha llamado al constructor de la clase &lt;span class="Apple-style-span" style="color: #990000;"&gt;clase2&lt;/span&gt;. Si hacemos la llamada entonces &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;clase3&lt;/span&gt;&lt;/b&gt; tiene todos los atributos que se esperaba heredar:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQIRri64e6I/AAAAAAAABH8/aeKhiQ3YfZ0/s1600/herencia_multiple_python12.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TQIRri64e6I/AAAAAAAABH8/aeKhiQ3YfZ0/s400/herencia_multiple_python12.JPG" width="375" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bueno, espero que este artículo os sirva de ayuda a la hora de utilizar la herencia múltiple, con cuidado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Saludos.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4723321474328263176?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4723321474328263176/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/herencia-multiple-en-python-el-orden.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4723321474328263176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4723321474328263176'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/herencia-multiple-en-python-el-orden.html' title='Herencia múltiple en Python, ¡el orden importa!'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y_bGxMwbE9g/TQIErU7fcjI/AAAAAAAABHU/wLov540LfXs/s72-c/herencia_multiple_python.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-2150092568438781587</id><published>2010-12-10T11:10:00.000+01:00</published><updated>2010-12-10T11:10:42.907+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='party'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='murcia'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>Python en Murcia, la primera y no la última...</title><content type='html'>Hola. En este post os dejo el enlace para que os descarguéis la presentación (lo he convertido a PDF) que realicé en la &lt;b&gt;Murcia Lan Party 2010&lt;/b&gt;, el pasado martes. Siento los que no podáis haber ido, ya que me hubiera gustado conoceros en persona, cambiar impresiones y plantearnos nuevas "quedadas", con más tiempo, para hablar de &lt;b&gt;Python&lt;/b&gt;, hacer talleres sobre tecnologías adyacentes (&lt;b&gt;wxPython&lt;/b&gt;, &lt;b&gt;Django&lt;/b&gt;, &lt;b&gt;móviles&lt;/b&gt;), es decir, aprender los unos de los otros. Sería una buena idea, creo yo.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQH7lQPmHTI/AAAAAAAABHI/qD2vIe5nTBg/s1600/IMG_1380.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TQH7lQPmHTI/AAAAAAAABHI/qD2vIe5nTBg/s320/IMG_1380.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La &lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;gente&lt;/span&gt;&lt;/b&gt; que fue a la presentación estuvo genial, ya que permanecieron sentados y a excepción de una persona, &lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;¡¡¡no se fue nadie!!!!&lt;/span&gt;&lt;/b&gt;. Tengo que decir que me alargué en exceso intentando explicar código &lt;b&gt;Python&lt;/b&gt;, algo que no volverá a suceder, ya que en vez de una hora me alargué a hora y media, algo que no puede ser, ya que me hice "algo pesado" en algún momento. Pero como de los errores se aprende, en la siguiente exposición (espero que esta sea la primera de muchas) seré mucho más conciso, para que todo sea más liviano.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQH72QXJLXI/AAAAAAAABHM/C9vMQ1w3438/s1600/IMG_1412.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TQH72QXJLXI/AAAAAAAABHM/C9vMQ1w3438/s320/IMG_1412.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;De todas formas estoy contento de haber ido, e incluso nos dió tiempo a una "mini" rueda de ruegos y preguntas sobre &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;El enlace donde podéis descargar la presentación es:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/elviajedelnavegante/documentacion"&gt;https://sites.google.com/site/elviajedelnavegante/documentacion&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-2150092568438781587?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/2150092568438781587/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/python-en-murcia-la-primera-y-no-la.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/2150092568438781587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/2150092568438781587'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/python-en-murcia-la-primera-y-no-la.html' title='Python en Murcia, la primera y no la última...'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y_bGxMwbE9g/TQH7lQPmHTI/AAAAAAAABHI/qD2vIe5nTBg/s72-c/IMG_1380.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-7424290634154146781</id><published>2010-12-05T21:17:00.000+01:00</published><updated>2010-12-05T21:17:21.742+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='party'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>Python en la Murcia Lan Party 2010, ¡¡¡ya tenemos hora!!!</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Hola. Ya me he puesto de acuerdo con la gente de la &lt;b&gt;Lan Party&lt;/b&gt;. Daré una charla de introducción a &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;, en &lt;b&gt;Murcia&lt;/b&gt;,&amp;nbsp;en&amp;nbsp;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;el &lt;b&gt;Pabellón Príncipe de Asturias&lt;/b&gt; (junto a la Biblioteca Regional de Murcia), &lt;b&gt;a las 19:00 del&lt;/b&gt; &lt;b&gt;martes 7 de Diciembre&lt;/b&gt;, en el &lt;b&gt;Aula 9&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;La charla rondará la hora de duración.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Mi objetivo prioritario es conoceros, para ponernos en contacto, hablar de &lt;b&gt;Python&lt;/b&gt;, de cosas que se podrían hacer. Como ya he comentado en el anterior &lt;b&gt;post&lt;/b&gt;, daré una charla introductoria sobre &lt;b&gt;Python&lt;/b&gt; (no un tutorial) y &lt;b&gt;wxPython&lt;/b&gt;, sobretodo por falta de tiempo, ya que 1 hora es algo apretado, y no quiero aburrir a la gente.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Voy a exponer un &lt;b&gt;Impress&lt;/b&gt; (exposición en &lt;b&gt;OpenOffice&lt;/b&gt;) y alguna que otra cosa más. Dicha presentación la colgaré estos días en el &lt;b&gt;blog&lt;/b&gt;, para que podáis echarle un vistazo.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Bueno, espero que os guste.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TPvyQVZhi7I/AAAAAAAABHE/h6V4UaDC7Lo/s1600/elviajedelnavegante.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="40" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TPvyQVZhi7I/AAAAAAAABHE/h6V4UaDC7Lo/s320/elviajedelnavegante.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Saludos.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-7424290634154146781?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/7424290634154146781/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/python-en-la-murcia-lan-party-2010-ya.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/7424290634154146781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/7424290634154146781'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/python-en-la-murcia-lan-party-2010-ya.html' title='Python en la Murcia Lan Party 2010, ¡¡¡ya tenemos hora!!!'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_y_bGxMwbE9g/TPvyQVZhi7I/AAAAAAAABHE/h6V4UaDC7Lo/s72-c/elviajedelnavegante.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-4922779655609678338</id><published>2010-12-02T21:16:00.002+01:00</published><updated>2010-12-05T21:04:52.965+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='party'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='conferencia'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wxPython'/><title type='text'>Conferencia de Python en la Murcia Lan Party 2010</title><content type='html'>Hola. Os comento que el martes 7 de diciembre, a las 19:00, daré una charla sobre &lt;strong&gt;Python&lt;/strong&gt; y &lt;strong&gt;wxPython &lt;/strong&gt;en &lt;strong&gt;Murcia&lt;/strong&gt;, en la &lt;a href="http://www.murcialanparty.com/mlp10/"&gt;Murcia Lan Party 2010&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TPf8zvYA6VI/AAAAAAAABG8/e8PMtZL9OfY/s1600/mlanparty10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="65" ox="true" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TPf8zvYA6VI/AAAAAAAABG8/e8PMtZL9OfY/s320/mlanparty10.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TPf820_xE8I/AAAAAAAABHA/_RDRmQm39eE/s1600/python_logo_negro.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TPf820_xE8I/AAAAAAAABHA/_RDRmQm39eE/s1600/python_logo_negro.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;He&amp;nbsp;hablado hoy mismo con el coordinador de la &lt;strong&gt;Lan Party&lt;/strong&gt; y me ha comentado que me daba cierta libertad, así que presentaré (si me da tiempo) el siguiente contenido:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;strong&gt;DISEÑO Y DESARROLLO DE APLICACIONES DE ESCRITORIO CON PYTHON Y WXPYTHON&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;1) Breve historia de Python.&lt;br /&gt;&lt;br /&gt;2) Breve introducción a Python: estructura, sintáxis y filosofía [ZEN de Python].&lt;br /&gt;&lt;br /&gt;3) Conceptos de programación fundamentales,&amp;nbsp;POO y persistencia de datos, en Python.&lt;br /&gt;&lt;br /&gt;4) El framework gráfico wxPython: breve introducción.&lt;br /&gt;&lt;br /&gt;5) Construcción de aplicaciones de escritorio con wxPython. &lt;br /&gt;&lt;br /&gt;7) IDE's, editores y GUI's para Python.&lt;br /&gt;&lt;br /&gt;Bueno,&amp;nbsp; si a alguien le interesa y puede venir, encantado de encontrarme con vosotros, para hablar un poco de &lt;strong&gt;Python&lt;/strong&gt;, de la vida, y de esta bendita profesión.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-4922779655609678338?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/4922779655609678338/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/conferencia-de-python-en-la-murcia-lan.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4922779655609678338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/4922779655609678338'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/12/conferencia-de-python-en-la-murcia-lan.html' title='Conferencia de Python en la Murcia Lan Party 2010'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y_bGxMwbE9g/TPf8zvYA6VI/AAAAAAAABG8/e8PMtZL9OfY/s72-c/mlanparty10.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-1398942788679459829</id><published>2010-11-10T19:02:00.001+01:00</published><updated>2010-11-10T19:03:11.527+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='política'/><title type='text'>Analfabetismo político</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;El peor analfabeto es el analfabeto político. Él no oye, no habla, no participa de los acontecimientos políticos.&lt;br /&gt;&lt;br /&gt;Él no sabe que el costo de vida, el precio del &lt;a href="http://es.wikipedia.org/wiki/Ejote"&gt;poroto&lt;/a&gt;, del pan, de la harina, del vestido, del zapato y de los remedios, dependen de decisiones políticas.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;El analfabeto político es tan burro que se enorgullece y ensancha el pecho diciendo que odia la política.&lt;br /&gt;&lt;br /&gt;No sabe que de su ignorancia política nace la prostituta, el menor abandonado y el peor de todos los bandidos que es el político corrupto, mequetrefe y lacayo de las empresas nacionales y multinacionales.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Bertolt_Brecht"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Bertolt Brecht&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-1398942788679459829?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/1398942788679459829/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/11/analfabetismo-politico.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1398942788679459829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/1398942788679459829'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/11/analfabetismo-politico.html' title='Analfabetismo político'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-86618862147296139</id><published>2010-10-20T22:50:00.006+02:00</published><updated>2010-10-22T10:39:55.390+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Me cambio de versión Python</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" &gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Hola. Hace aproximadamente un año que empecé a barajar la opción de aprender un lenguaje de programación nuevo, lo suficientemente bueno para mí, que respondiera a lo que exijo, ya que las plataformas actuales no me terminaban de convencer (y todavía siguen sin convencerme del todo), como &lt;b&gt;PHP&lt;/b&gt;, &lt;b&gt;Java&lt;/b&gt; ó &lt;b&gt;.NET&lt;/b&gt;. Entonces probé &lt;b&gt;Ruby&lt;/b&gt; y &lt;b&gt;Python&lt;/b&gt;, y me quedé con el último. Había multitud de versiones, y me decidí por &lt;b&gt;Python 2.5.4&lt;/b&gt; por la cantidad de software de terceros que estaba programado para esta versión. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una gran versión de &lt;b&gt;Python &lt;/b&gt;la &lt;b&gt;2.5.4&lt;/b&gt;. Pero hay que seguir (¡y evolucionar!), así que me cambio a la última versión de &lt;b&gt;Python&lt;/b&gt; &lt;span class="Apple-style-span" &gt;que no sea 2.7 ó 3.XX&lt;/span&gt;, esto es, &lt;b&gt;Python 2.6.6&lt;/b&gt;. ¿Por qué? La &lt;span class="Apple-style-span" &gt;2.7&lt;/span&gt; sinceramente no me da confianza suficiente y necesito aplicaciones que corran en la &lt;b&gt;2.6&lt;/b&gt;. Y &lt;span class="Apple-style-span" &gt;Python 3000&lt;/span&gt;, todavía está en fase de desarrollo ó pruebas ó test o como lo quieran llamar. Es una opinión personal mía, claro, y cualquier navegante podrá decir lo contrario. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A partir de este post, todo lo que escriba se hará con &lt;b&gt;Python 2.6.6&lt;/b&gt;, y salvo excepciones, en plataforma &lt;b&gt;Microsoft Windows XP SP3&lt;/b&gt;. Puesto que &lt;b&gt;Python&lt;/b&gt; es &lt;b&gt;multiplataforma&lt;/b&gt;, no hay problemas para &lt;b&gt;Mac&lt;/b&gt; ó &lt;b&gt;Linux&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TL9WJpnSz5I/AAAAAAAABGE/9HCguIFiSss/s1600/python_2.6_bis.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 346px;" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TL9WJpnSz5I/AAAAAAAABGE/9HCguIFiSss/s400/python_2.6_bis.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5530233591223734162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TL9WDJGjFiI/AAAAAAAABF8/pT7HlwGFNx0/s1600/python_2.6.6.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 346px;" src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TL9WDJGjFiI/AAAAAAAABF8/pT7HlwGFNx0/s400/python_2.6.6.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5530233479417239074" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TMFNXwk8fTI/AAAAAAAABGM/ChCtEckOsYs/s1600/python_2.6.6_bis2.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TMFNXwk8fTI/AAAAAAAABGM/ChCtEckOsYs/s400/python_2.6.6_bis2.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5530786887959870770" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 346px; " /&gt;&lt;/a&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TMFNcuGg65I/AAAAAAAABGU/5EE-fm2D_xU/s1600/python_2.6.6_bis3.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TMFNcuGg65I/AAAAAAAABGU/5EE-fm2D_xU/s400/python_2.6.6_bis3.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5530786973194709906" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 346px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Saludos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-86618862147296139?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/86618862147296139/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/me-cambio-de-version-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/86618862147296139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/86618862147296139'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/me-cambio-de-version-python.html' title='Me cambio de versión Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y_bGxMwbE9g/TL9WJpnSz5I/AAAAAAAABGE/9HCguIFiSss/s72-c/python_2.6_bis.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-5550050698541479797</id><published>2010-10-18T01:36:00.001+02:00</published><updated>2010-10-18T01:37:28.669+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='programar'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Herramientas (IDE, GUI, EDITOR) para desarrollar en Python</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLQc8BKRYxI/AAAAAAAAA-M/Qdmdml55aTw/s1600/editor-gui-ide.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLQc8BKRYxI/AAAAAAAAA-M/Qdmdml55aTw/s400/editor-gui-ide.JPG" alt="" id="BLOGGER_PHOTO_ID_5527074460119687954" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 342px; height: 400px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: right; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;PRUEBA, COMPARA Y SI ENCUENTRAS ALGO MEJOR, INSTÁLALO&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Hola. Desde que estoy programando en &lt;b&gt;Python&lt;/b&gt; siempre he estado buscando esa aplicación para programar en este estupendo framework de desarrollo. Y después de varios meses me he dado cuenta que mi búsqueda ha sido futil. Esto es, no hay un &lt;b&gt;editor&lt;/b&gt; ó &lt;b&gt;IDE&lt;/b&gt; mejor que otro, cada uno tiene sus características, y en la mayoría de los casos hacen lo mismo. Además, también cuenta la experiencia previa. Así, gente que venga del mundo de &lt;b&gt;Linux&lt;/b&gt; con programación en &lt;b&gt;C&lt;/b&gt; puede ser que sean forofos de &lt;b&gt;Emacs&lt;/b&gt; ó de &lt;b&gt;vim&lt;/b&gt;. Si se viene del mundo de &lt;b&gt;Java&lt;/b&gt;, pues &lt;b&gt;NetBeans&lt;/b&gt; (con el plugin correspondiente) es una opción excelente. Con esto quiero decir que no hay un &lt;b&gt;IDE&lt;/b&gt; ó&lt;b&gt;editor&lt;/b&gt; definitivo para &lt;b&gt;Python&lt;/b&gt;, solamente la experiencia en la utilización así como nuestras vivencias anteriores son las que marcarán la elección del mismo. Es más, se puede trabajar con más de un editor, aunque en &lt;b&gt;Python&lt;/b&gt;, por el tema de la indentación de código, quizás no sea lo más recomendable.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En este post voy a describir los &lt;b&gt;IDE's&lt;/b&gt;, &lt;b&gt;editores&lt;/b&gt; y &lt;b&gt;GUI's&lt;/b&gt; que he probado y he estado utilizando durante casi un año. Solamente voy a incluir los que me han gustado. Omito los que menos me han convencido, puesto que no quiero desmerecer el trabajo de nadie, ya que este artículo es subjetivo teniendo en cuenta que aquí entran los gustos de programación de cada uno. Por ejemplo, no quiero hablar de &lt;b&gt;Eclipse&lt;/b&gt; (con el plugin &lt;b&gt;Pydev&lt;/b&gt;), que aunque sé que es un &lt;b&gt;IDE&lt;/b&gt;estupendo, tengo otras preferencias. Evidentemente no he visto todos, así por ejemplo, el &lt;b&gt;IDE&lt;/b&gt;&lt;a href="http://www.monkeystudio.org/"&gt;MonkeyStudio&lt;/a&gt; no lo he probado, por varias razones (una de las cuales se encuentra que no trabajo con &lt;b&gt;Qt)&lt;/b&gt;, al igual que &lt;b&gt;Spyder&lt;/b&gt; (también utiliza &lt;b&gt;Qt&lt;/b&gt;) que está orientado para científicos,&lt;b&gt;PIDA&lt;/b&gt;, &lt;b&gt;Leo, eric&lt;/b&gt;, etc. También se ha dado el caso de productos que he visto pero por ser de pago no he podido seguir indagando, como es el caso de &lt;b&gt;wxDesigner&lt;/b&gt;, un &lt;b&gt;GUI&lt;/b&gt; para desarrollo de interfaces gráficas en &lt;b&gt;wxPython&lt;/b&gt;. Tiene muchos &lt;b&gt;widgets&lt;/b&gt; y &lt;b&gt;Sizers&lt;/b&gt;, sin embargo la versión de prueba no deja guardar el fichero generado, así que no me deja evaluar el producto correctamente, y en consecuencia puedo hablar muy poco de él. Y por último hay software que quizás debería terminarse antes de lanzarse al mercado como herramientas de desarrollo en&lt;b&gt;Python&lt;/b&gt;, como es el caso de &lt;b&gt;FarPy&lt;/b&gt;, otro &lt;b&gt;GUI&lt;/b&gt; que sencillamente explota cuando menos te lo esperas, así como &lt;b&gt;IronPython Studio&lt;/b&gt;, un despropósito para desarrollar en &lt;b&gt;IronPython&lt;/b&gt;, que no es que estalle, sencillamente se derrumba.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En la &lt;a href="http://www.python.org/"&gt;página oficial de Python&lt;/a&gt; se puede encontrar toda una relación de las mejores herramientas de desarrollo para &lt;b&gt;Python&lt;/b&gt;, tanto &lt;a href="http://wiki.python.org/moin/PythonEditors"&gt;IDE's, GUI's como editores&lt;/a&gt;, en todas las plataformas (&lt;b&gt;Linux&lt;/b&gt;,&lt;b&gt;Mac&lt;/b&gt;,&lt;b&gt; Windows&lt;/b&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;Dejando algunos conceptos claros&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;¿Qué es un IDE?&lt;/b&gt; &lt;b&gt;IDE&lt;/b&gt; son las siglas de entorno de desarrollo integrado. Es una aplicación (entorno de programación) para desarrollar software que está compuesto normalmente por un editor de código, un compilador ó un intérprete, herramientas auxiliares de desarrollo (creación de documentación, tests, empaquetado de software), un depurador y algunas veces un diseñador de interfaces gráficas incorporado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;¿Qué es un GUI&lt;/b&gt;? &lt;b&gt;GUI&lt;/b&gt; son las siglas de interfaz gráfica de usuario. Son herramientas para crear interfaces gráficas, esto es, componentes gráficos con los cuales el usuario interacciona con la aplicación. Hay algunos &lt;b&gt;IDE's&lt;/b&gt; que contienen &lt;b&gt;GUI's&lt;/b&gt; integrados.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;¿Qué es un editor?&lt;/b&gt; Un &lt;b&gt;editor&lt;/b&gt; es una aplicación para escribir código de programación en el lenguaje deseado, en nuestro caso,&lt;b&gt; Python&lt;/b&gt;. Contiene todas las herramientas de edición necesarias, y algunas veces características propias de &lt;b&gt;IDE's&lt;/b&gt;. Hay veces que cuesta distinguir entre un &lt;b&gt;IDE&lt;/b&gt; y un &lt;b&gt;editor&lt;/b&gt; por la cantidad de opciones que tiene este último.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;¿Qué es un RAD?&lt;/b&gt; &lt;b&gt;RAD&lt;/b&gt; son las siglas de desarrollo rápido de aplicaciones. Dependiendo del autor sirve para designar a las aplicaciones de desarrollo de interfaces gráficas ó a los &lt;b&gt;IDE's&lt;/b&gt; con&lt;b&gt;GUI's&lt;/b&gt; integrados, o a las dos cosas. Es un término dado a plataformas de desarrollo como&lt;b&gt;PowerBuilder&lt;/b&gt;, &lt;b&gt;Visual Studio&lt;/b&gt; ó &lt;b&gt;Delphi&lt;/b&gt;, por poner ejemplos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;Herramientas de desarrollo en Python&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A continuación presento las herramientas de desarrollo que he evaluado durante estos meses y que más me han gustado. ¿La herramienta perfecta? Un compendio de todas ellas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;IDE con GUI integrado: &lt;span class="Apple-style-span"&gt;BOA Constructor&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;SharpDevelop&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;IDE: &lt;span class="Apple-style-span"&gt;IDLE&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;NetBeans&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;Stani's Python Editor&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;PyScripter&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;Geany&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;Pyragua&lt;/span&gt;,&lt;span class="Apple-style-span"&gt;Wingware Python IDE, PythonWin&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;GUI:&lt;span class="Apple-style-span"&gt; wxGlade&lt;/span&gt;,&lt;span class="Apple-style-span"&gt; wxFormBuilder&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Editor: &lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Editra&lt;/span&gt;, &lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Notepad++&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;Jedit&lt;/span&gt;, &lt;span class="Apple-style-span"&gt;Gedit, BlueFish, SciTE&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Shell interactivo&lt;/b&gt;: &lt;span class="Apple-style-span"&gt;&lt;b&gt;Dreampie&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://www.scintilla.org/SciTE.html"&gt;SciTE&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Scite&lt;/b&gt; es un &lt;b&gt;editor&lt;/b&gt; de texto para programadores, con un amplio abanico de lenguajes, incluido&lt;b&gt;Python&lt;/b&gt;, por supuesto. Su potencial reside en su gran capacidad de configuración. Permite exportar a &lt;b&gt;PDF&lt;/b&gt;, &lt;b&gt;Latex&lt;/b&gt;, &lt;b&gt;RTF&lt;/b&gt;, &lt;b&gt;XML&lt;/b&gt; y &lt;b&gt;HTML&lt;/b&gt;. A nivel de edición está extraordinariamente completo. Además se puede compilar en el propio editor (e incluir parámetros ) y ver la salida del script. Tiene coloreado e indentación de código. Muy buen software, basado en &lt;b&gt;Scintilla&lt;/b&gt;. Aunque originalmente está en inglés, se puede traducir al español mediante un &lt;a href="http://groups.google.com/group/scite-interest/web/translations"&gt;fichero&lt;/a&gt;, que hay que descargarlo.Hay que copiar el archivo &lt;b&gt;locale.es.properties&lt;/b&gt; en la carpeta de &lt;b&gt;SciTE&lt;/b&gt; y renombrarlo como &lt;b&gt;locale.properties&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1AYnBD4I/AAAAAAAABEU/B0KqUErBAhs/s1600/scite2.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1AYnBD4I/AAAAAAAABEU/B0KqUErBAhs/s400/scite2.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529000879505608578" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 281px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLr0yTFCl8I/AAAAAAAABEM/0AHBUnNn6lc/s1600/scite1.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLr0yTFCl8I/AAAAAAAABEM/0AHBUnNn6lc/s400/scite1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529000637502756802" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 278px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1WrvIqDI/AAAAAAAABEc/Dzm6zvFDvuo/s1600/scite3.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1WrvIqDI/AAAAAAAABEc/Dzm6zvFDvuo/s400/scite3.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529001262597056562" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 347px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1jLiaBeI/AAAAAAAABEk/rQEmZQFXNsI/s1600/scite4.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1jLiaBeI/AAAAAAAABEk/rQEmZQFXNsI/s400/scite4.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529001477292033506" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 347px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1xnrwMdI/AAAAAAAABEs/0PqCuIU4dJo/s1600/scite5.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLr1xnrwMdI/AAAAAAAABEs/0PqCuIU4dJo/s400/scite5.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529001725365596626" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 342px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://boa-constructor.sourceforge.net/"&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;BOA Constructor&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;BOA Constructor&lt;/b&gt; es un &lt;b&gt;IDE&lt;/b&gt; y un &lt;b&gt;GUI&lt;/b&gt; para &lt;b&gt;wxPython&lt;/b&gt;. Podría considerarse como un &lt;b&gt;RAD&lt;/b&gt;. Es lo más parecido a &lt;b&gt;Microsoft Visual Studio&lt;/b&gt; ó &lt;b&gt;Delphi&lt;/b&gt;, pero para &lt;b&gt;Python&lt;/b&gt;. Tiene un editor, con coloreado, indentación y completitud de código (basado en &lt;b&gt;Scintilla&lt;/b&gt;), así como un &lt;b&gt;GUI&lt;/b&gt; para diseñar interfaces gráficas en &lt;b&gt;wxPython&lt;/b&gt;. El posicionamiento de widgets del diseñador gráfico se puede realizar mediante coordenadas con &lt;b&gt;wx.Point&lt;/b&gt; ó con &lt;b&gt;Sizers&lt;/b&gt;. Tiene inspector de código, se puede crear packages, módulos, setup's, etc. Tiene vista &lt;b&gt;UML&lt;/b&gt;, generación de código y un largo etcétera. Además incluye una ayuda en línea muy potente y agradecida. Una herramienta &lt;b&gt;RAD&lt;/b&gt;completa que aunque es algo antigua (2006) está muy probada y es una excelente opción para desarrollar en &lt;b&gt;Python&lt;/b&gt;. Muy recomendada.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLt26796vyI/AAAAAAAABE0/fd2uCBx_wC4/s1600/boa.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLt26796vyI/AAAAAAAABE0/fd2uCBx_wC4/s400/boa.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529143722429300514" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 223px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLt3SWW9hcI/AAAAAAAABE8/osdc9dygdNA/s1600/boa_editor.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLt3SWW9hcI/AAAAAAAABE8/osdc9dygdNA/s400/boa_editor.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529144124650653122" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 241px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt3kP90GaI/AAAAAAAABFE/cjvKkrixHkg/s1600/boa3.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt3kP90GaI/AAAAAAAABFE/cjvKkrixHkg/s400/boa3.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529144432172210594" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 242px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt32R-XP3I/AAAAAAAABFM/vGrAQaB4xpo/s1600/boa4.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt32R-XP3I/AAAAAAAABFM/vGrAQaB4xpo/s400/boa4.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529144741949030258" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 223px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt4KsEeQDI/AAAAAAAABFU/8xsQmeW3AIs/s1600/boa5.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt4KsEeQDI/AAAAAAAABFU/8xsQmeW3AIs/s400/boa5.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529145092551360562" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 298px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLt4Z76y66I/AAAAAAAABFc/5bn_hq6bw2w/s1600/boa6.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLt4Z76y66I/AAAAAAAABFc/5bn_hq6bw2w/s400/boa6.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529145354503777186" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 223px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLt4oH3HLZI/AAAAAAAABFk/zb9kNiZJHVs/s1600/boa7.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLt4oH3HLZI/AAAAAAAABFk/zb9kNiZJHVs/s400/boa7.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529145598227721618" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 342px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLt42RiSsBI/AAAAAAAABFs/Om19Z1dBJXc/s1600/boa8.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLt42RiSsBI/AAAAAAAABFs/Om19Z1dBJXc/s400/boa8.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529145841342918674" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 343px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt5Nafn-CI/AAAAAAAABF0/Fg0pvmqhLFs/s1600/boa9.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLt5Nafn-CI/AAAAAAAABF0/Fg0pvmqhLFs/s400/boa9.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5529146238884640802" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 274px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://bluefish.openoffice.nl/"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;Bluefish&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Bluefish&lt;/b&gt; es un editor para diseñadores web experimentados y programadores, soporta varios lenguajes de programación y de marcado, pero se centra en crear sitios web dinámicos e interactivos. Aunque tiene su fuerte en la creación de páginas web también soporta &lt;b&gt;Python&lt;/b&gt;, con indentación, coloración y completitud de código. Muy ligero y elegante. Una herramienta a tener en cuenta si además estamos creando diseños web.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLroqeFE0DI/AAAAAAAABDs/tiphD2iwwfU/s1600/bluefish1.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLroqeFE0DI/AAAAAAAABDs/tiphD2iwwfU/s400/bluefish1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528987308877205554" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 231px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLrpIwZk3EI/AAAAAAAABD0/zreCDTM1ymI/s1600/bluefish2.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLrpIwZk3EI/AAAAAAAABD0/zreCDTM1ymI/s400/bluefish2.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528987829191105602" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 229px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLrpUIWc77I/AAAAAAAABD8/fWpQVEGx9rU/s1600/bluefish3.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLrpUIWc77I/AAAAAAAABD8/fWpQVEGx9rU/s400/bluefish3.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528988024599015346" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 231px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLrpjO5RVUI/AAAAAAAABEE/yxry4ku3LsM/s1600/bluefish4.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLrpjO5RVUI/AAAAAAAABEE/yxry4ku3LsM/s400/bluefish4.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528988284053706050" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 231px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 153); "&gt;&lt;a href="http://www.wingware.com/" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;Wingware Python IDE&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;Wingware Python IDE&lt;/span&gt; es quizás el mejor&lt;span style="font-weight: bold; "&gt; IDE&lt;/span&gt; para &lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt; que hay actualmente, y digo quizás, con permiso de &lt;span style="font-weight: bold; "&gt;Komodo&lt;/span&gt;, porque lo tiene todo, realmente todo, lo que se le puede pedir a un &lt;span style="font-weight: bold; "&gt;IDE&lt;/span&gt; para desarrollar en &lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt;. El único problema que tiene este software es que es de pago. Solo lo he podido evaluar con pequeños scripts, pero me ha convencido desde el primer momento. Lo tiene todo, excepto que la licencia ronda los 200 dólares.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wingware.blogspot.com/"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLowbFrucTI/AAAAAAAABCs/mck6aYxyig8/s400/wingware1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528784734490882354" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 110px; " /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLowyDAkRPI/AAAAAAAABC0/mDt5fOG1XdI/s1600/wingware2.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLowyDAkRPI/AAAAAAAABC0/mDt5fOG1XdI/s400/wingware2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528785128909980914" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 223px; " /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLoxAFeDJkI/AAAAAAAABC8/MzCm2KhMRM0/s1600/wingware3.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLoxAFeDJkI/AAAAAAAABC8/MzCm2KhMRM0/s400/wingware3.JPG" alt="" id="BLOGGER_PHOTO_ID_5528785370088678978" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 223px; " /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLoxhge5lKI/AAAAAAAABDM/aJ0fQswTtxg/s1600/wingware4.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLoxhge5lKI/AAAAAAAABDM/aJ0fQswTtxg/s400/wingware4.JPG" alt="" id="BLOGGER_PHOTO_ID_5528785944275686562" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 223px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); "&gt;&lt;a href="http://sourceforge.net/projects/spe/"&gt;&lt;span style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;Stani's Python Editor&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pythonide.blogspot.com/"&gt;&lt;span style="font-weight: bold; "&gt;Stani's Python Editor&lt;/span&gt;&lt;/a&gt; ó &lt;span style="font-weight: bold; "&gt;SPE&lt;/span&gt; es el &lt;span style="font-weight: bold; "&gt;IDE&lt;/span&gt; &lt;span style="font-style: italic; "&gt;pythónico&lt;/span&gt; gratuito más completo que he visto, exclusivo para programar en &lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt;. Incluye lo típico en edición, más coloreado (resaltado), indentación y completitud de código, depurador (&lt;span style="font-weight: bold; "&gt;winpdb&lt;/span&gt;), ejecución de scripts, chequeo de sintaxis, incluye el diseñador &lt;span style="font-weight: bold; "&gt;wxGlade&lt;/span&gt;, generación automática de documentación, visualización de clases mediante diagramas &lt;span style="font-weight: bold; "&gt;UML&lt;/span&gt;, etc. Un &lt;span style="font-weight: bold; "&gt;IDE&lt;/span&gt; muy potente y &lt;span style="font-style: italic; "&gt;pythónico&lt;/span&gt;. Muy recomendado.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLoq3c03HoI/AAAAAAAABCU/DhkJubbTh1M/s1600/spe_1.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLoq3c03HoI/AAAAAAAABCU/DhkJubbTh1M/s400/spe_1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528778624669785730" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 248px; " /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLorPPZTTPI/AAAAAAAABCc/BUoOQmdrMtg/s1600/spe_2.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLorPPZTTPI/AAAAAAAABCc/BUoOQmdrMtg/s400/spe_2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528779033381391602" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 248px; " /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLorxTL2KzI/AAAAAAAABCk/bKUcR2hlPRU/s1600/spe_3.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLorxTL2KzI/AAAAAAAABCk/bKUcR2hlPRU/s400/spe_3.JPG" alt="" id="BLOGGER_PHOTO_ID_5528779618514250546" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 248px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;&lt;a href="http://wxglade.sourceforge.net/" style="color: rgb(0, 0, 153); "&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;wxGlade&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;wxGlade&lt;/span&gt; es un &lt;span style="font-weight: bold; "&gt;GUI&lt;/span&gt; para diseño de interfaces gráficas en el framework gráfico &lt;span style="font-weight: bold; "&gt;wxPython&lt;/span&gt;. Todo un clásico en entornos &lt;span style="font-weight: bold; "&gt;Linux&lt;/span&gt;, desde hace ya bastante tiempo, y una herramienta muy válida y potente. Permite crear código &lt;span style="font-weight: bold; "&gt;wxPython&lt;/span&gt; a partir del diseño gráfico, mediante la utilización de &lt;span style="font-weight: bold; "&gt;Sizers&lt;/span&gt; (es obligatorio), no pudiendo utilizar el posicionamiento con &lt;span style="font-weight: bold; "&gt;wx.Point&lt;/span&gt;. En este blog se ha escrito bastante sobre &lt;span style="font-weight: bold; "&gt;wxGlade&lt;/span&gt;, por lo que os presento un artículo de&lt;a href="http://elviajedelnavegante.blogspot.com/2010/01/crear-una-agenda-en-python-primera.html"&gt; cómo diseñar una interfaz gráfica&lt;/a&gt;, así como el código de ejemplo de la&lt;a href="http://elviajedelnavegante.blogspot.com/2010/03/crear-mantenimiento-basico-con-python-y.html"&gt; creación de un mantenimiento típico&lt;/a&gt;. Recomendable.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.geany.org/"&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;Geany&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;Geany&lt;/span&gt; es un &lt;span style="font-weight: bold; "&gt;IDE&lt;/span&gt; rápido y ligero, muy recomendable para proyectos pequeños y medianos, por su rapidez y sencillez. Lleva un completo arsenal de opciones de edición, así como la posibilidad de ejecución de scripts. Contiene un árbol de navegación de elementos (clases, métodos, etc), así como indentación, coloración y completitud de código. Dentro de los &lt;span style="font-weight: bold; "&gt;IDE's&lt;/span&gt; es el más básico, ya que contiene lo mínimo y necesario para desarrollar en &lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt; de manera rápida. &lt;span style="font-weight: bold; "&gt;Geany &lt;/span&gt;es el típico caso de un &lt;span style="font-weight: bold; "&gt;IDE&lt;/span&gt; que pudiera considerarse un&lt;span style="font-weight: bold; "&gt; editor&lt;/span&gt; avanzado con llamada al intérprete de&lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt; para ejecutar código&lt;span style="font-weight: bold; "&gt; Python&lt;/span&gt;. Todo depende del criterio a la hora de definir lo que es un&lt;span style="font-weight: bold; "&gt;editor&lt;/span&gt; ó un &lt;span style="font-weight: bold; "&gt;IDE&lt;/span&gt;. Este producto es recomendable.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLofwCdT9-I/AAAAAAAABCM/DLNNaRUM7Mk/s1600/geany_python.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLofwCdT9-I/AAAAAAAABCM/DLNNaRUM7Mk/s400/geany_python.JPG" alt="" id="BLOGGER_PHOTO_ID_5528766402704701410" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 236px; " /&gt;&lt;/a&gt;&lt;a href="http://www.geany.org/"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); "&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 153); "&gt;&lt;a href="http://www.jedit.org/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;Jedit&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;Jedit&lt;/span&gt; es un editor de texto para programadores escrito en &lt;span style="font-weight: bold; "&gt;Java&lt;/span&gt; (es necesaria la máquina virtual&lt;span style="font-weight: bold; "&gt;Java&lt;/span&gt;). Para programar en &lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt; hay que instalarse 2 plugins desde el &lt;span style="font-weight: bold; "&gt;Plugin Manager&lt;/span&gt; que lleva incorporado. Es un editor muy configurable, de grandes prestaciones.&lt;br /&gt;&lt;a href="http://www.geany.org/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.geany.org/"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLoayMGuTrI/AAAAAAAABB0/oekdSIMJyog/s400/jedit_python.JPG" alt="" id="BLOGGER_PHOTO_ID_5528760942095912626" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 273px; " /&gt;&lt;/a&gt;&lt;a href="http://www.geany.org/"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLoa-Zhv3rI/AAAAAAAABB8/Xg_u8vYT2sc/s400/jedit_python1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528761151857352370" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 296px; " /&gt;&lt;/a&gt;&lt;a href="http://www.geany.org/"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLobOHXgeVI/AAAAAAAABCE/7NqX-FcW_jo/s400/jedit_python2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528761421860469074" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 305px; " /&gt;&lt;br /&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 153); "&gt;&lt;a href="http://projects.gnome.org/gedit/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;Gedit&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;a href="http://www.geany.org/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; "&gt;Gedit&lt;/span&gt; es el editor oficial del entorno de escritorio &lt;span style="font-weight: bold; "&gt;Gnome&lt;/span&gt; de &lt;span style="font-weight: bold; "&gt;Linux&lt;/span&gt;. Existe versión para&lt;span style="font-weight: bold; "&gt;Windows&lt;/span&gt;. Su simplicidad y el reconocimiento de código &lt;span style="font-weight: bold; "&gt;Python&lt;/span&gt; lo hace una opción muy interesante para escribir scripts rápidos. Es un editor muy simple y efectivo.&lt;br /&gt;&lt;a href="http://www.geany.org/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.geany.org/"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLoUtf1RYNI/AAAAAAAABBs/a_z797ZtavU/s400/gedit_python.JPG" alt="" id="BLOGGER_PHOTO_ID_5528754264422310098" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 339px; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;&lt;a href="http://dreampie.sourceforge.net/"&gt;Dreampie&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Dreampie&lt;/b&gt; es un shell interactivo para &lt;b&gt;Python&lt;/b&gt;, no pudiéndose enmarcar ni como &lt;b&gt;editor&lt;/b&gt; ni como&lt;b&gt; IDE&lt;/b&gt; (ni mucho menos &lt;b&gt;GUI&lt;/b&gt;). Lo he incluido en este artículo ya que no sería completo del todo sin nombrar al menos a un intérprete de &lt;b&gt;Python&lt;/b&gt;. Existen otras aplicaciones de este estilo, como &lt;b&gt;PyCrust&lt;/b&gt; ó &lt;b&gt;PyShell&lt;/b&gt;, sin embargo &lt;b&gt;Dreampie&lt;/b&gt; es bastante singular ya que la ventana principal se divide en dos, un área de histórico, que permite ver el código procesado así como su resultado y un área donde escribir el código. Esto permite editar cualquier cantidad de código, y ejecutarlo cuando esté listo. También se puede copiar el código desde cualquier lugar, editar y ejecutar al instante. Tiene coloreado, indentación y completitud de código (muy rápido). Se puede exportar los resultados a &lt;b&gt;HTML&lt;/b&gt;. La verdad que un producto muy bueno, que utilizo normalmente. Muy recomendado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLhbMpleO8I/AAAAAAAABBM/bTBI13fPiq8/s1600/dreampie1.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLhbMpleO8I/AAAAAAAABBM/bTBI13fPiq8/s400/dreampie1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528268815476865986" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 310px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLhbVGu0wrI/AAAAAAAABBU/ysS_q4wWWVo/s1600/dreampie2.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLhbVGu0wrI/AAAAAAAABBU/ysS_q4wWWVo/s400/dreampie2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528268960739672754" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 310px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhbcAIZLLI/AAAAAAAABBc/B9sP7Oq_aPE/s1600/dreampie3.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhbcAIZLLI/AAAAAAAABBc/B9sP7Oq_aPE/s400/dreampie3.JPG" alt="" id="BLOGGER_PHOTO_ID_5528269079226952882" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 310px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhbk54isqI/AAAAAAAABBk/RsvlDkermHQ/s1600/dreampie4.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhbk54isqI/AAAAAAAABBk/RsvlDkermHQ/s400/dreampie4.JPG" alt="" id="BLOGGER_PHOTO_ID_5528269232168678050" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 338px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;NOTA: PyCrust&lt;span class="Apple-style-span" style="font-weight: normal; "&gt; tiene la misma funcionalidad que &lt;/span&gt;Dreampie&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;, e incluso es más potente, sin embargo, por cuestiones de gusto y comodidad (y aquí entra mucho la subjetividad) prefiero&lt;/span&gt;Dreampie&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;a href="http://notepad-plus-plus.org/"&gt;&lt;span class="Apple-style-span"&gt;Notepad++&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;NotePad++&lt;/b&gt; es un viejo conocido de los editores de programación, y de los más populares en toda la comunidad de desarrollo. En el área de &lt;b&gt;plugins &lt;/b&gt;se puede bajar uno específico para&lt;b&gt;Python&lt;/b&gt;. No lleva completitud de código si nos referimos a la búsqueda en el &lt;b&gt;namespace&lt;/b&gt; de módulos, pero si te sugiere vocablos mientras se escribe. A nivel de edición de texto, lo lleva todo (búsquedas, sangrías, etc). Una de las características más relevantes es su grado elevado de configuración. Una buena herramienta, de toda la vida.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhUWzo415I/AAAAAAAABAk/ANcNf5Uw174/s1600/notepad_python1.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhUWzo415I/AAAAAAAABAk/ANcNf5Uw174/s400/notepad_python1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528261293392844690" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 307px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhUfzoAckI/AAAAAAAABAs/mc49ZJGsecI/s1600/notepad_python2.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhUfzoAckI/AAAAAAAABAs/mc49ZJGsecI/s400/notepad_python2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528261448007971394" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 275px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhUnoooTOI/AAAAAAAABA0/IQYy5Jz-9yk/s1600/notepad_python3.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhUnoooTOI/AAAAAAAABA0/IQYy5Jz-9yk/s400/notepad_python3.JPG" alt="" id="BLOGGER_PHOTO_ID_5528261582496746722" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 277px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhUudeh_7I/AAAAAAAABA8/gr0gk1LMR0A/s1600/notepad_python4.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhUudeh_7I/AAAAAAAABA8/gr0gk1LMR0A/s400/notepad_python4.JPG" alt="" id="BLOGGER_PHOTO_ID_5528261699760684978" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 288px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhU1gc5EyI/AAAAAAAABBE/MH23G3pU9RY/s1600/notepad_python5.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhU1gc5EyI/AAAAAAAABBE/MH23G3pU9RY/s400/notepad_python5.JPG" alt="" id="BLOGGER_PHOTO_ID_5528261820818199330" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 224px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;&lt;a href="http://netbeans.org/"&gt;&lt;span class="Apple-style-span"&gt;NetBeans&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://wiki.netbeans.org/Python"&gt;NetBeans&lt;/a&gt;&lt;/b&gt; es un tremendo y muy potente &lt;b&gt;IDE&lt;/b&gt; desarrollado por &lt;b&gt;Sun&lt;/b&gt;, que ahora es de &lt;b&gt;Oracle&lt;/b&gt;. En origen &lt;b&gt;NetBeans&lt;/b&gt; estaba pensado para &lt;b&gt;Java&lt;/b&gt;, pero mediante &lt;b&gt;plugins&lt;/b&gt; podemos programar en varios lenguajes, tales como &lt;b&gt;Ruby&lt;/b&gt;, &lt;b&gt;PHP&lt;/b&gt; ó &lt;b&gt;Python&lt;/b&gt; entre otros. No se sabe muy bien que rumbo tomará &lt;b&gt;NetBeans&lt;/b&gt; (ni&lt;b&gt; Java&lt;/b&gt;) con la compra de &lt;b&gt;Sun&lt;/b&gt; por parte de&lt;b&gt; Oracle&lt;/b&gt;. Este &lt;b&gt;IDE&lt;/b&gt; es de los más completos que existen en el mercado actualmente y gratuitos, siendo también muy pesado (si no tienes una máquina potente, mejor pensar en otra opción). Lleva de todo, indentación, completitud y coloreado de código, debugger, gestión de repositorios de versiones como &lt;b&gt;Mercurial&lt;/b&gt;, &lt;b&gt;CVS&lt;/b&gt; o &lt;b&gt;Subversion&lt;/b&gt;, y un largo etcétera. Para entornos profesionales (empresas) de programación en &lt;b&gt;Python&lt;/b&gt; recomiendo este &lt;b&gt;IDE&lt;/b&gt;. Lo lleva todo y más, a excepción de un &lt;b&gt;GUI&lt;/b&gt; integrado. Una vez instalado este software es necesario descargarse el &lt;b&gt;plugin&lt;/b&gt; de&lt;b&gt;Python&lt;/b&gt; (se hace desde el propio &lt;b&gt;IDE&lt;/b&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhPTMh2eiI/AAAAAAAAA_0/t3E63UkZyyc/s1600/netbeans_para_python1.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhPTMh2eiI/AAAAAAAAA_0/t3E63UkZyyc/s400/netbeans_para_python1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528255733796600354" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 242px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhPhkzEsHI/AAAAAAAAA_8/MNZo1E3Q_2g/s1600/netbeans_para_python2.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLhPhkzEsHI/AAAAAAAAA_8/MNZo1E3Q_2g/s400/netbeans_para_python2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528255980829454450" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 249px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhPqbSYsoI/AAAAAAAABAE/qbrH-vGLBW8/s1600/netbeans_para_python3.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhPqbSYsoI/AAAAAAAABAE/qbrH-vGLBW8/s400/netbeans_para_python3.JPG" alt="" id="BLOGGER_PHOTO_ID_5528256132895257218" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 242px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhPyP-j9RI/AAAAAAAABAM/AGZ92W-BL4A/s1600/netbeans_para_python4.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLhPyP-j9RI/AAAAAAAABAM/AGZ92W-BL4A/s400/netbeans_para_python4.JPG" alt="" id="BLOGGER_PHOTO_ID_5528256267298272530" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 206px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLhP5NL04xI/AAAAAAAABAU/l1WGHViz_lU/s1600/netbeans_para_python5.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLhP5NL04xI/AAAAAAAABAU/l1WGHViz_lU/s400/netbeans_para_python5.JPG" alt="" id="BLOGGER_PHOTO_ID_5528256386807685906" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 242px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhQBOflrEI/AAAAAAAABAc/bbuPeKWskB0/s1600/netbeans_para_python6.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLhQBOflrEI/AAAAAAAABAc/bbuPeKWskB0/s400/netbeans_para_python6.JPG" alt="" id="BLOGGER_PHOTO_ID_5528256524597963842" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 241px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;&lt;a href="http://wiki.python.org/moin/IDLE"&gt;&lt;span class="Apple-style-span"&gt;IDLE&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;IDLE&lt;/b&gt; es un &lt;b&gt;IDE&lt;/b&gt; que viene de serie en cualquier distribución de &lt;b&gt;Python&lt;/b&gt;, escrito en &lt;b&gt;Tkinter&lt;/b&gt;. Para empezar a programar y aprender &lt;b&gt;Python&lt;/b&gt; es la herramienta más recomendada. Con completitud de código e indentación automática y configurable, coloración de código, un depurador integrado (debugger) y todas las características propias de un editor de código. No es recomendable para proyectos grandes y no debe de utilizarse con &lt;b&gt;wxPython&lt;/b&gt;, ya que son incompatibles y los resultados son impredecibles. El gran potencial de &lt;b&gt;IDLE&lt;/b&gt; es su shell integrado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLYpgGUklnI/AAAAAAAAA-U/9ZIlnDFO7mk/s1600/idle.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLYpgGUklnI/AAAAAAAAA-U/9ZIlnDFO7mk/s400/idle.JPG" alt="" id="BLOGGER_PHOTO_ID_5527651224073311858" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 294px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLYp7UCESeI/AAAAAAAAA-c/XHmZ-Kk7m4A/s1600/idle1.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLYp7UCESeI/AAAAAAAAA-c/XHmZ-Kk7m4A/s400/idle1.JPG" alt="" id="BLOGGER_PHOTO_ID_5527651691610261986" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 332px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://mmm-experts.com/Products.aspx?ProductID=4"&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;PyScripter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;PyScripter&lt;/b&gt; es un &lt;b&gt;IDE&lt;/b&gt; desarrollado en &lt;b&gt;Delphi &lt;/b&gt;para la plataforma &lt;b&gt;Windows&lt;/b&gt;. Es una excelente opción alternativa a otros &lt;b&gt;IDE's&lt;/b&gt; de alto nivel, como &lt;b&gt;Eclipse&lt;/b&gt;, &lt;b&gt;Wingide&lt;/b&gt; ó &lt;b&gt;NetBeans&lt;/b&gt;. Este es sin lugar a dudas una extraordinario &lt;b&gt;IDE&lt;/b&gt; para desarrollos grandes en &lt;b&gt;Python&lt;/b&gt;. Contiene todo lo que se puede desear, depurador, gestión de proyectos, múltiples ficheros abiertos, indentación, coloreado y completitud de código, codificación de ficheros, y un sin fin de opciones que lo hacen una alternativa muy fiable y completa. Yo, que trabajo normalmente en la plataforma&lt;b&gt;Microsoft Windows&lt;/b&gt;, lo he adoptado como software para desarrollar en &lt;b&gt;Python&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;. Excelente producto. Muy recomendable.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLd425DHSsI/AAAAAAAAA_U/Wb60eETUMk0/s1600/pyscripter1.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLd425DHSsI/AAAAAAAAA_U/Wb60eETUMk0/s400/pyscripter1.JPG" alt="" id="BLOGGER_PHOTO_ID_5528019952042724034" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 247px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLd5gYZdA3I/AAAAAAAAA_c/vvOWA8GB0_Y/s1600/pyscripter2.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLd5gYZdA3I/AAAAAAAAA_c/vvOWA8GB0_Y/s400/pyscripter2.JPG" alt="" id="BLOGGER_PHOTO_ID_5528020664832557938" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 248px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLd6Hpstw1I/AAAAAAAAA_k/L0KsSb_tUvI/s1600/pyscripter3.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLd6Hpstw1I/AAAAAAAAA_k/L0KsSb_tUvI/s400/pyscripter3.JPG" alt="" id="BLOGGER_PHOTO_ID_5528021339491648338" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 246px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLd6YgD0XVI/AAAAAAAAA_s/edL4ee5cLZc/s1600/pyscripter4.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLd6YgD0XVI/AAAAAAAAA_s/edL4ee5cLZc/s400/pyscripter4.JPG" alt="" id="BLOGGER_PHOTO_ID_5528021628961971538" border="0" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 248px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://editra.org/"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;Editra&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Editra&lt;/b&gt; es un &lt;b&gt;editor&lt;/b&gt; avanzado de desarrollo, escrito en &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;wxPython&lt;/b&gt;. Excelente herramienta. Tenéis más información en el artículo de &lt;a href="http://elviajedelnavegante.blogspot.com/2010/02/editra-un-editor-para-desarrollar-en.html"&gt;El Viaje del Navegante sobre Editra&lt;/a&gt;, que escribí hace unos meses. Recomendado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;a href="http://pyragua.pyroxdev.org/"&gt;Pyragua&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Pyragua&lt;/b&gt; es un &lt;b&gt;IDE&lt;/b&gt; creado en &lt;b&gt;Python&lt;/b&gt; para desarrollar en &lt;b&gt;Python&lt;/b&gt;. Todavía está en fases tempranas de desarrollo, pero las perspectivas son realmente buenas. Hay que darles tiempo a los chicos de &lt;b&gt;Pyrox&lt;/b&gt;. En este blog hay un&lt;a href="http://elviajedelnavegante.blogspot.com/2010/04/pyragua-ide-para-desarrollar-con-python.html"&gt; post sobre este IDE&lt;/a&gt; que escribí hace unos meses. Un trabajo que sigo. Muy prometedor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;SharpDevelop&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;SharpDevelop&lt;/b&gt; es un &lt;b&gt;RAD&lt;/b&gt;, un &lt;b&gt;IDE&lt;/b&gt; con &lt;b&gt;GUI &lt;/b&gt;incorporado, al estilo de &lt;b&gt;Visual Studio&lt;/b&gt;, con el que se puede desarrollar en &lt;b&gt;IronPython&lt;/b&gt;, esto es, &lt;b&gt;Python&lt;/b&gt; para acceder al &lt;b&gt;framework de .NET&lt;/b&gt;. En este blog hay varios artículos en los que se utiliza esta fantástica herramienta. Aquí os presento un link sobre &lt;a href="http://elviajedelnavegante.blogspot.com/2010/04/ironpython-y-sharpdevelop-en-espanol.html"&gt;IronPython y SharpDevelop&lt;/a&gt; que escribí hace unos meses. Excelente y muy recomendado para utilizar &lt;b&gt;IronPython&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153); "&gt;&lt;a href="http://wxformbuilder.org/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;wxFormBuilder&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;wxFormBuilder&lt;/span&gt; es un &lt;span style="font-weight: bold; "&gt;GUI&lt;/span&gt; para diseñar interfaces gráficas que genera código &lt;span style="font-weight: bold; "&gt;C++&lt;/span&gt; y código&lt;span style="font-weight: bold; "&gt;Python &lt;/span&gt;con el framework gráfico &lt;span style="font-weight: bold; "&gt;wxPython&lt;/span&gt;. Es una herramienta con una interfaz amigable, que utiliza &lt;span style="font-weight: bold; "&gt;Sizers&lt;/span&gt; de manera obligatoria para la gestión del posicionamiento de widgets dentro de los contenedores. Lo bueno de este producto es la inclusión de widgets actualizados, así como la posibilidad de ampliarlos. Muy buena opción para diseñar pantallas y entender la filosofía en la utilización de &lt;span style="font-weight: bold; "&gt;Sizers&lt;/span&gt;. En este blog se han escrito algunos artículos sobre &lt;span style="font-weight: bold; "&gt;wxFormBuilder&lt;/span&gt; (&lt;a href="http://elviajedelnavegante.blogspot.com/2010/09/los-sizer-de-wxpython-en-wxformbuilder.html"&gt;1&lt;/a&gt; y&lt;a href="http://elviajedelnavegante.blogspot.com/2010/10/wxformbuilder-uso-del-widget.html"&gt;2&lt;/a&gt;). Muy recomendable.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://wiki.python.org/moin/PythonWin"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;PythonWin&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Python Editor for Windows&lt;/b&gt; ó &lt;b&gt;PythonWin&lt;/b&gt; es un &lt;b&gt;IDE&lt;/b&gt; que viene incluido en el &lt;b&gt;Python for Win32&lt;/b&gt;, de &lt;b&gt;Mark Hammond&lt;/b&gt;, una extensión de &lt;b&gt;Python&lt;/b&gt; para&lt;b&gt; Windows&lt;/b&gt;. Con esta herramienta se puede analizar objetos &lt;b&gt;COM&lt;/b&gt; y acceder a sus clases, entre otras cosas. Soporta completitud, coloración e indentación de código. Incluye &lt;b&gt;PyChecker&lt;/b&gt;, para analizar la sintaxis antes de ejecutar un script. Hace unos meses escribí un post sobre como interactuar con objetos&lt;b&gt;COM&lt;/b&gt; por medio de la utilidad &lt;b&gt;COM Makepy &lt;/b&gt;que lleva esta aplicación. Lo podéis encontrar &lt;a href="http://elviajedelnavegante.blogspot.com/2010/09/lanzar-informes-crystal-reports-desde.html"&gt;aquí&lt;/a&gt;. Todo un clásico, rápido y eficaz.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLrCEU1XNrI/AAAAAAAABDU/3qh0QtLD2Ts/s1600/pythonwin1.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLrCEU1XNrI/AAAAAAAABDU/3qh0QtLD2Ts/s400/pythonwin1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528944872118498994" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 210px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLrCSTK1TNI/AAAAAAAABDc/YfUY8pexIgw/s1600/pythonwin2.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLrCSTK1TNI/AAAAAAAABDc/YfUY8pexIgw/s400/pythonwin2.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528945112189848786" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 209px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLrCtMt0hkI/AAAAAAAABDk/B7xf90TbHcM/s1600/pythonwin3.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_y_bGxMwbE9g/TLrCtMt0hkI/AAAAAAAABDk/B7xf90TbHcM/s400/pythonwin3.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5528945574314018370" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 308px; height: 359px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large; "&gt;&lt;span class="Apple-style-span"&gt;CONCLUSIONES&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;¿Qué es lo que se necesita? Un &lt;b&gt;GUI&lt;/b&gt;, un &lt;b&gt;IDE&lt;/b&gt; ó un &lt;b&gt;editor&lt;/b&gt;. Si se va a programar interfaces gráficas sería interesante el uso de un &lt;b&gt;GUI&lt;/b&gt; para diseñar ciertas plantillas o pantallas, de manera visual, para ir más rápido y tener las cosas más claras, aunque no es necesario si no se quiere. Aquí se ha visto &lt;b&gt;GUI's&lt;/b&gt; para &lt;b&gt;wxPython&lt;/b&gt;, pero se debe de dejar claro que para plataformas como&lt;b&gt;Qt&lt;/b&gt; ó &lt;b&gt;GTK&lt;/b&gt; también hay &lt;b&gt;GUI's&lt;/b&gt;, y muy buenos, como &lt;b&gt;GTK Glade&lt;/b&gt; ó &lt;b&gt;MonkeyStudio&lt;/b&gt;. Si se va a crear un proyecto largo y grande lo mejor, desde mi punto de vista, es seleccionar un &lt;b&gt;IDE&lt;/b&gt;, ya que tiene una serie de herramientas que nos van a facilitar la vida. Si el proyecto es mediano ó pequeño, o simplemente se está empezando en el mundo de &lt;b&gt;Python&lt;/b&gt;, un editor es una opción muy recomendable, ya que no necesitamos tantas opciones como nos puede brindar un &lt;b&gt;IDE&lt;/b&gt;. De todas formas hay veces que no hay diferencia entre &lt;b&gt;editores&lt;/b&gt; e &lt;b&gt;IDE's&lt;/b&gt; por la cantidad de opciones que tienen los primeros.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo mínimo que se le debe de pedir a cualquier &lt;b&gt;IDE&lt;/b&gt; ó &lt;b&gt;editor&lt;/b&gt;, para desarrollar en &lt;b&gt;Python&lt;/b&gt;, es la&lt;b&gt;indentación&lt;/b&gt;, &lt;b&gt;coloreado&lt;/b&gt; y &lt;b&gt;completitud de código&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Una lista completa de &lt;span style="font-weight: bold; "&gt;editores&lt;/span&gt;, &lt;span style="font-weight: bold; "&gt;gui's&lt;/span&gt; e &lt;span style="font-weight: bold; "&gt;ide's&lt;/span&gt; se puede encontrar en la siguiente dirección web&lt;/div&gt;&lt;div&gt;&lt;a href="http://wiki.python.org/moin/PythonEditors"&gt;http://wiki.python.org/moin/PythonEditors&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;PRUEBA, COMPARA Y SI ENCUENTRAS ALGO MEJOR, INSTÁLALO&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Saludos.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-5550050698541479797?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/5550050698541479797/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/herramientas-ide-gui-editor-para_18.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5550050698541479797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/5550050698541479797'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/herramientas-ide-gui-editor-para_18.html' title='Herramientas (IDE, GUI, EDITOR) para desarrollar en Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y_bGxMwbE9g/TLQc8BKRYxI/AAAAAAAAA-M/Qdmdml55aTw/s72-c/editor-gui-ide.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-8846641735740879911</id><published>2010-10-14T17:30:00.008+02:00</published><updated>2010-10-14T18:08:40.952+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clase'/><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='property'/><category scheme='http://www.blogger.com/atom/ns#' term='herencia'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='objeto'/><title type='text'>Las propiedades (Property) de Python</title><content type='html'>Cuando estamos trabajando con clases, en &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt;, lo normal es crear unos atributos y unos métodos que accedan a dichos atributos, para modificar, asignar o devolver su valor. Para ello se aconseja que los atributos sean ocultos, de manera que únicamente, a través de los métodos, se pueda acceder a sus valores. Por ejemplo, una clase que defina a una &lt;span style="font-weight: bold;"&gt;persona&lt;/span&gt; puede ser la siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ser_humano(object):&lt;br /&gt;   def __init__(self, edad, altura, peso):&lt;br /&gt;       self.__edad=edad&lt;br /&gt;       self.__altura=altura&lt;br /&gt;       self.__peso=peso&lt;br /&gt;&lt;br /&gt;   def getPeso(self):&lt;br /&gt;       return self.__peso&lt;br /&gt;&lt;br /&gt;   def setPeso(self, peso = None):&lt;br /&gt;       self.__peso = peso&lt;br /&gt;&lt;br /&gt;   def getAltura(self):&lt;br /&gt;       return self.__altura&lt;br /&gt;&lt;br /&gt;   def setAltura(self, altura = None):&lt;br /&gt;       self.__altura = altura&lt;br /&gt;&lt;br /&gt;   def getEdad(self):&lt;br /&gt;       return self.__edad&lt;br /&gt;&lt;br /&gt;   def setEdad(self, edad = None):&lt;br /&gt;       self.__edad = edad&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como se puede observar al instanciar la clase se tienen que pasar los valores de los atributos para la inicialización. Para modificar los valores de los mismos se ha implementado, para cada atributo un método del tipo &lt;span style="font-weight: bold;"&gt;set****&lt;/span&gt;, y para devolver el valor del atributo se implementa el &lt;span style="font-weight: bold;"&gt;get****&lt;/span&gt;. Podemos ver en nuestro&lt;span style="font-style: italic;"&gt; shell&lt;/span&gt; favorito al instanciar la clase, de lo que disponemos en el objeto creado:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;persona = ser_humano(32,1.70,70)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLcjE_1Np5I/AAAAAAAAA-k/snewOY9VKZA/s1600/property1.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLcjE_1Np5I/AAAAAAAAA-k/snewOY9VKZA/s400/property1.JPG" alt="" id="BLOGGER_PHOTO_ID_5527925636381648786" border="0" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLcjE_1Np5I/AAAAAAAAA-k/snewOY9VKZA/s1600/property1.JPG"&gt;&lt;br /&gt;&lt;/a&gt;En &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; hay otra alternativa al uso de &lt;span style="font-weight: bold;"&gt;set****&lt;/span&gt; ó &lt;span style="font-weight: bold;"&gt;get****&lt;/span&gt; y es envolver dichos métodos dentro de &lt;span style="font-weight: bold;"&gt;propiedades&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Una &lt;span style="font-weight: bold;"&gt;propiedad&lt;/span&gt; (&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;property&lt;/span&gt;) en &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; es un mecanismo que se utiliza para dar propiedades&lt;br /&gt;a la instanciación de clases (a los objetos). Las &lt;span style="font-weight: bold;"&gt;propiedades&lt;/span&gt; realizan tareas parecidas a las que realizan &lt;span style="font-weight: bold;"&gt;__getattr__&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;__setattr__&lt;/span&gt; y&lt;span style="font-weight: bold;"&gt; __delattr__&lt;/span&gt;, pero más rápido y fácil. Una propiedad se crea llamando a &lt;span style="font-weight: bold;"&gt;property&lt;/span&gt; y vinculando su resultado al atributo de clase. La sintaxis es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;atributo = property(fget = None, fset = None, fdel = None, doc = None)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Veamos la creación de propiedades en la clase anterior:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ser_humano(object):&lt;br /&gt;   def __init__(self, edad, altura, peso):&lt;br /&gt;       self.__edad=edad&lt;br /&gt;       self.__altura=altura&lt;br /&gt;       self.__peso=peso&lt;br /&gt;&lt;br /&gt;   def __getPeso(self):&lt;br /&gt;       return self.__peso&lt;br /&gt;&lt;br /&gt;   def __setPeso(self, peso = None):&lt;br /&gt;       self.__peso = peso&lt;br /&gt;&lt;br /&gt;   def __getAltura(self):&lt;br /&gt;       return self.__altura&lt;br /&gt;&lt;br /&gt;   def __setAltura(self, altura = None):&lt;br /&gt;       self.__altura = altura&lt;br /&gt;&lt;br /&gt;   def __getEdad(self):&lt;br /&gt;       return self.__edad&lt;br /&gt;&lt;br /&gt;   def __setEdad(self, edad = None):&lt;br /&gt;       self.__edad = edad&lt;br /&gt;&lt;br /&gt;   peso = property(fget = __getPeso, fset = __setPeso, doc = 'Peso')&lt;br /&gt;   edad = property(fget = __getEdad, fset = __setEdad, doc= 'Edad')&lt;br /&gt;   altura = property(fget = __getAltura, fset = __setAltura, doc = 'Altura')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lo que ahora hemos hecho ha sido ocultar todos los métodos&lt;span style="font-weight: bold;"&gt; get****&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;set****&lt;/span&gt; y crear 3 propiedades nuevas, de manera que sólo ellas sean públicas. Nos vamos al &lt;span style="font-style: italic;"&gt;shell&lt;/span&gt; y vemos que únicamente aparece como interfaz pública del objeto creado &lt;span style="font-weight: bold;"&gt;peso&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;edad&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;altura&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLckO3wHrxI/AAAAAAAAA-s/dI_Tjj_TD90/s1600/property2.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 423px; height: 235px;" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLckO3wHrxI/AAAAAAAAA-s/dI_Tjj_TD90/s400/property2.JPG" alt="" id="BLOGGER_PHOTO_ID_5527926905523121938" border="0" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLckk9l7KrI/AAAAAAAAA-0/kg4tUEb7LmQ/s1600/property3.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 222px;" src="http://4.bp.blogspot.com/_y_bGxMwbE9g/TLckk9l7KrI/AAAAAAAAA-0/kg4tUEb7LmQ/s400/property3.JPG" alt="" id="BLOGGER_PHOTO_ID_5527927285048093362" border="0" /&gt;&lt;/a&gt;Haciendo:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a = ser_humano(29,1.65,98)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a&lt;/span&gt; es una instancia de&lt;span style="font-weight: bold;"&gt; ser_humano&lt;/span&gt;. Cuando se hace referencia a &lt;span style="font-weight: bold;"&gt;a.atributo&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; llama en &lt;span style="font-weight: bold;"&gt;a&lt;/span&gt; al método que se declara como argumento&lt;span style="font-weight: bold;"&gt; fget&lt;/span&gt;. Así, &lt;span style="font-weight: bold;"&gt;print a.altura&lt;/span&gt; devolverá &lt;span style="font-weight: bold;"&gt;1.65&lt;/span&gt;. Cuando asignamos &lt;span style="font-weight: bold;"&gt;a.atributo = valor&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; llama al método que definimos como argumento&lt;span style="font-weight: bold;"&gt; fset&lt;/span&gt;, esto es, a &lt;span style="font-weight: bold;"&gt;fset&lt;/span&gt; se le pasa &lt;span style="font-weight: bold;"&gt;valor&lt;/span&gt;. Podemos modificar el &lt;span style="font-weight: bold;"&gt;peso&lt;/span&gt; haciendo&lt;span style="font-weight: bold;"&gt; a.peso = 70&lt;/span&gt;. Para finalizar, cuando ejecutamos &lt;span style="font-weight: bold;"&gt;del x.atributo&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; llama al método que declaramos como argumento en&lt;span style="font-weight: bold;"&gt; fdel&lt;/span&gt;. &lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; utiliza el argumento&lt;span style="font-weight: bold;"&gt; doc&lt;/span&gt; como cadena de documentación del atributo.&lt;br /&gt;&lt;br /&gt;Cuando un argumento no se declara la operación correspondiente se impide. Así, por ejemplo, si queremos que el atributo &lt;span style="font-weight: bold;"&gt;edad&lt;/span&gt; sea de sólo lectura tendremos que declarar la propiedad tal que así: &lt;span style="font-weight: bold;"&gt;edad = property(fget = __getEdad, doc= 'Edad')&lt;/span&gt; Es decir, hacemos que el atributo &lt;span style="font-weight: bold;"&gt;edad&lt;/span&gt; sea de solo lectura porque definimos el argumento &lt;span style="font-weight: bold;"&gt;fget&lt;/span&gt; y no definimos&lt;span style="font-weight: bold;"&gt; fset&lt;/span&gt; ni &lt;span style="font-weight: bold;"&gt;fdel&lt;/span&gt;. Si quisiéramos dar un valor a la propiedad &lt;span style="font-weight: bold;"&gt;edad&lt;/span&gt; daría error (&lt;span style="font-weight: bold;"&gt;AttributeError: can't set attribute&lt;/span&gt;), como cabría esperar:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLcocTYcvQI/AAAAAAAAA-8/4lergqHqk60/s1600/property4.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 268px;" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLcocTYcvQI/AAAAAAAAA-8/4lergqHqk60/s400/property4.JPG" alt="" id="BLOGGER_PHOTO_ID_5527931534324841730" border="0" /&gt;&lt;/a&gt;Mediante las&lt;span style="font-weight: bold;"&gt; propiedades&lt;/span&gt; podemos hacer públicos los atributos de forma completamente segura, como parte de la interfaz pública de la clase.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;Cuidado con la herencia&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las &lt;span style="font-weight: bold;"&gt;propiedades&lt;/span&gt; se heredan como cualquier otro atributo. Sin embargo los métodos que se utilizan en las&lt;span style="font-weight: bold;"&gt; propiedades&lt;/span&gt; son los que se definen en la clase en la que la &lt;span style="font-weight: bold;"&gt;propiedad &lt;/span&gt;se define. Veámoslo con el siguiente ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class numero_pi(object):&lt;br /&gt;   def pi(self):&lt;br /&gt;       return 3.14&lt;br /&gt;   pi_magico = property(pi)&lt;br /&gt;&lt;br /&gt;class numero_pi_mejorado(numero_pi):&lt;br /&gt;   def pi(self):&lt;br /&gt;       return 3.14159&lt;br /&gt;&lt;br /&gt;a = numero_pi_mejorado()&lt;br /&gt;print a.pi_magico&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLcpELqZTzI/AAAAAAAAA_E/jRupHCXCv2Q/s1600/property5.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 268px;" src="http://3.bp.blogspot.com/_y_bGxMwbE9g/TLcpELqZTzI/AAAAAAAAA_E/jRupHCXCv2Q/s400/property5.JPG" alt="" id="BLOGGER_PHOTO_ID_5527932219447398194" border="0" /&gt;&lt;/a&gt;El lector esperaría &lt;span style="font-weight: bold;"&gt;3.14159&lt;/span&gt;, pero en realidad es &lt;span style="font-weight: bold;"&gt;3.14&lt;/span&gt;, ya que la &lt;span style="font-weight: bold;"&gt;propiedad&lt;/span&gt; hace referencia a los métodos de la clase en la que está definida ella misma. Para solventar el problema podemos envolver el método &lt;span style="font-weight: bold;"&gt;pi&lt;/span&gt; en otro método, tal que así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class numero_pi(object):&lt;br /&gt;   def pi(self):&lt;br /&gt;       return 3.14&lt;br /&gt;   def pi_envuelto(self):&lt;br /&gt;       return self.pi()&lt;br /&gt;   pi_magico = property(pi_envuelto)&lt;br /&gt;&lt;br /&gt;class numero_pi_mejorado(numero_pi):&lt;br /&gt;   def pi(self):&lt;br /&gt;       return 3.14159&lt;br /&gt;&lt;br /&gt;a = numero_pi_mejorado()&lt;br /&gt;print a.pi_magico&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLcpfNcoXSI/AAAAAAAAA_M/01djeXbREQQ/s1600/property6.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 328px;" src="http://2.bp.blogspot.com/_y_bGxMwbE9g/TLcpfNcoXSI/AAAAAAAAA_M/01djeXbREQQ/s400/property6.JPG" alt="" id="BLOGGER_PHOTO_ID_5527932683783003426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-8846641735740879911?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/8846641735740879911/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/las-propiedades-property-de-python.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8846641735740879911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/8846641735740879911'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/las-propiedades-property-de-python.html' title='Las propiedades (Property) de Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y_bGxMwbE9g/TLcjE_1Np5I/AAAAAAAAA-k/snewOY9VKZA/s72-c/property1.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-7126491951284537010</id><published>2010-10-12T16:23:00.005+02:00</published><updated>2010-10-12T16:37:48.943+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Script (mejorado y configurable) para contar caracteres de ficheros en Python</title><content type='html'>Y el definitivo script para contar caracteres en ficheros de texto pasados como parámetro. Ahora, se puede incluir flags, de manera que se puede configurar si se quiere contar caracteres especiales. Así, por ejemplo, si queremos contar los caracteres que un fichero, sin contar los espacios en blanco, simplemente haremos:&lt;span style="color: rgb(0, 0, 153);"&gt; python script.py fichero.txt -SPACE&lt;/span&gt;, donde  es el &lt;span style="color: rgb(153, 51, 0);"&gt;script.py&lt;/span&gt; es el fichero que contiene el script &lt;span style="color: rgb(102, 0, 0);"&gt;y fichero.txt&lt;/span&gt; el archivo al cual queremos contar los caracteres.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Script para contar caracteres en un fichero de texto dado, pasado&lt;br /&gt;# como parámetro. ¡Tercer intento!&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;# Declaramos algunas constantes.&lt;br /&gt;FF = '\f' # Form Feed&lt;br /&gt;LF = '\n' # Line Feed&lt;br /&gt;CR = '\r' # Carriage Return&lt;br /&gt;TAB = '\t' # Tabulador&lt;br /&gt;SPACE = ' ' # Blanco&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;    excepcion = 0&lt;br /&gt;    lista_excepcion = []&lt;br /&gt;    fichero = sys.argv[1]&lt;br /&gt;    opciones = sys.argv[2:]&lt;br /&gt;    if '-FF' in opciones: lista_excepcion.append(FF)&lt;br /&gt;    if '-LF' in opciones: lista_excepcion.append(LF)&lt;br /&gt;    if '-CR' in opciones: lista_excepcion.append(CR)&lt;br /&gt;    if '-TAB' in opciones: lista_excepcion.append(TAB)&lt;br /&gt;    if '-SPACE' in opciones: lista_excepcion.append(SPACE)&lt;br /&gt;    f = open(fichero,"r")&lt;br /&gt;    caracteres = f.read()&lt;br /&gt;    for i in caracteres:&lt;br /&gt;        if i in lista_excepcion: excepcion += 1&lt;br /&gt;    f.close()&lt;br /&gt;    print "El fichero %s tiene %d caracteres" \&lt;br /&gt;    %(fichero, len(caracteres) - excepcion)&lt;br /&gt;except: print "Error al abrir el fichero."&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8474947454225853305-7126491951284537010?l=elviajedelnavegante.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elviajedelnavegante.blogspot.com/feeds/7126491951284537010/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/script-mejorado-y-configurable-para.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/7126491951284537010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8474947454225853305/posts/default/7126491951284537010'/><link rel='alternate' type='text/html' href='http://elviajedelnavegante.blogspot.com/2010/10/script-mejorado-y-configurable-para.html' title='Script (mejorado y configurable) para contar caracteres de ficheros en Python'/><author><name>Ángel Luis</name><uri>http://www.blogger.com/profile/09966712995497159376</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_y_bGxMwbE9g/S2Fq40lu0TI/AAAAAAAAAAY/JDnwWBoRNcQ/S220/foto_3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8474947454225853305.post-108737341558285252</id><published>2010-10-12T16:07:00.003+02:00</published><updated>2010-10-12T16:11:57.961+02:00</upda
