Python, Boa y wxPython
Python
Desde hace algún tiempo estoy programando en Python. Definitivamente es un lenguaje que se acomoda a mis circunstancias (el mundo en cuanto mundo de alguien, según la DRAE). Quiero decir que aunque me las pasaría todo el día delante de la pantalla desarrollando software, mi día a día tiene poco que ver con desarrollar software. Buscaba por eso un lenguaje en el que pudiera pasar del concepto al programa rápido, y que tuviera librerías suficientemente completas. Además, un lenguaje en el que los programas corrieran sin o con poca modificación tanto en Linux como en Windows, y si era posible, también en MacOS, una plataforma cada vez más tentadora.
Python es un lenguaje excelente. No voy a abundar en esto, ya hay todo una guerra al respecto (un artículo interesante es Python is not Java). Estoy bastante cómodo programando en Python y ya tengo suficientes horas de recorrido como para que una expresión como l = [ “%s” % row['Name'] for row in rows ]
me salga más natural que escribir
l = []
for row in rows:
l.append( “%s” % row['Name'] )
Además, por si en algún momento el lado oscuro nos comienza a parecer más atractivo, hay muchos artículos sobre Python que despejan toda nube de sombra y además ensalzan en ego. (Por ejemplo, Great Hackers, de Paul Graham)
He dedicado no poco tiempo a escoger una buena librería para la interfase del usuario (… para el user interface, UI, etc.). Hay gran variedad disponible, algunas muy completas, otras son proyectos incipientes. Para casi todas hay bindings para Python. He optado por wxPython (que son los bindings para Python a wxWidgets (An open source C++ GUI framework to make cross-platform programming child's play, según los desarrolladores de la libería). La estructura de este framework es bastante ordenada. Hay versiones de wxPython para Linux, Windows, MacOs, etc., de modo que el programa funciona sin cambios en cualquiera de las plataformas en las que está disponible Python y wxPython. Una buena prueba de esto es el demo que viene con wxPython.
Eventos y entornos de desarrollo
Como en la mayoría de librerías para interfaces gráficas, los controles (widgets) de wxPython interactúan entre sí generando o reaccionado a eventos. Si quiero que el programa muestre ayuda cuando el usuario hace click sobre el botón de ayuda, tengo que escribir una función que muestre la información de ayuda, y decirle a wxPython que esa función es el handler para el evento que genera el botón cuando lo presionan.
También se agradece poder diseñar la interfaz del usuario (user interface) gráficamente. Hay varios diseñadores para wxPython, aunque casi todos los que he probado tienen un vacío, y es que no permiten vincular los eventos que generan los objetos de la librería a los respectivos handlers. Después de diseñar gráficamente la interfaz, hay que buscar los controles en el código y empezar a vincular manualmente los handlers respectivos . El generador de código, por su parte, suele reescribir parte del código cuando se modifica el diseño de la interfaz gráfica, borrando todo lo que esté en medio. Por eso, el código para vincular los handlers al control hay que escribirlo más abajo, o más arriba, o en un método aparte, pero no junto al control al que hacen referencia. Estas limitaciones son molestas, sobre todo teniendo en cuenta que la documentación de wxPython es bien parca (eso sí hay, viene con un demo omnicomprensivo, que es realmente excelente) y no es fácil tener en la cabeza todos los eventos que genera cada control.
WingIDE también es muy buen producto. He usado unas semanas la versión de evaluación (es un producto comercial) y si más adelante veo que lo de vincular los eventos no es tan indispensable, probablemente me anime a invertir en este programa, que tiene un precio razonable.