Programando GUIs en Python

Imagen de ElSanto

Tema: 

Existen distintas librerías con las que desarrollar aplicaciones con interfaces gráficas de usuario (GUI) en Python. Cada toolkit tiene ventajas y desventajas, la mayoría son multiplataforma (lo cual es un punto notable a favor). Desde mi experiencia (poca, y posiblemente equivocada) voy a intentar describir alguno de ellos:



  • Tkinter

    Se puede decir que es el estándar en Python. Se distribuye junto con el propio intérprete de Python, es multiplataforma y está muy bien documentado. Un excelente lugar donde conocer Tkinter es este o bien dentro de la propia web de Python, aquí.

    En mi opinión su mayor ventaja es que se distribuye junto con el intérprete. Es muy sencillo de aprender, si ya sabes Python, escribir en Tkinter una aplicación con una mínima funcionalidad no te llevará más de un par de horas (eso es lo que me llevó a mí programar esto sin saber nada de Tkinter y soy bastante torpe).

    Pegas: Hay pocos widgets (cierto, están todos los habituales pero se echa en falta alguno más). Un ejemplo, un clásico ListBox con scroll no existe. Hay que crear el ListBox y el ScrollBar por separado. Es cierto que esta operación son tres líneas:

    self.barrascroll_lista = Scrollbar(self.panel)

    self.lista = Listbox (self.panel, yscrollcommand =self.barrascroll_lista.set, selectmode=SINGLE)

    self.barrascroll_lista.config (command=self.lista.yview)

    pero se agradecerían widgets de más alto nivel. Otro problema que le veo (ésta es una opinión personal) es que en Linux, las aplicaciones se ven "feas". Los widgets son bastante poco atractivos (los de OpenMotif creo que utliza...). En windows esto no sucede ya que usa los widgets nativos (MFC se llaman ¿no?)

  • Tix

    Tix significa Tk Interface eXtension. Así podemos decir que Tix es una extensión de Tkinter. También se distribuye con la distribución estándar de Python. Sin embargo en la versión de Python 2.2 (no sé si la 2.1 también estará afectada) de Windows "se olvidaron" de incluirlo. Esto significa que si tu script utliza Tix y quieres ejecutarlo en windows tendrás que bajarlo e instalarlo.

    No he probado a fondo Tix, pero parece que añade unas cuantas funcionalidades a Tkinter. Si quieres saber más de Tix visita su web. Aquí tienes sus widgets.

    Si usas Tkinter y/o Tix puedes utilizar Spectix, una aplicación para crear interfaces de forma gráficamente. Personalmente, no me gustó demasiado (aunque hay gente que le saca partido).

  • Pmw

    Pmw es otro intento de construir widgets de alto nivel utilizando Tkinter. La documentación tiene buena pinta y he oido hablar bastante bien de él (en la lista de Python). Puedes encontrar Pmw aquí.

  • PyGTK

    Empezamos ya con cosas mayores. PyGTK permite utilizar las librerías gtk en tus scripts. La documentación parece buena (digo parece, porque uno sólo aprecia la bondad o maldad de una documentación cuado tiene que usarla, y yo nunca he usado PyGTK), con un FAQ que parece tratar todos los temas importantes. Su página principal puedes encontrarla aquí. No hay que olvidar además, que podrás utlizar Glade.

    La única pega que le veo es el tema de la portabilidad. En la documentación de PyGTK, se trata el tema de cómo portar una aplicacion con PyGTK a Win32, pero a mí no me ha quedado nada claro, y distribuir una aplicación para usuarios de Windows que requiera una instalación un poco "trabajosa" (algo más que un doble click) está abocado al fracaso (esto también es una opinión personal).

  • PyQT

    Todo lo dicho en el caso anterior es reproducible en este, sólo que la portabilidad se complica ahora aún más por el tema de las licencias. Puedes conocer PyQT aquí. Y sí también se puede utilizar Qt Designer.

  • wxPython

    Esto me lo he dejado para el final. wxPython , que no es más que la adaptación de wxWindows a Python. En mi opinión, y si damos importancia a la portabilidad, wxPython es la solución óptima. Si escribimos una aplicación ya la ejecutamos en Linux, utilizará gtk para mostrar las ventanas, y en windows utilizará las ventanas nativas de windows.

    La documentación no es todo lo buena que debiera, aunque con un poco de buena voluntad se sale adelante. Por ejemplo, leyendo el wxPyWiki podemos hacernos una idea del funcionamiento de wxPython, pero se queda corto en muchos aspectos. En estos casos no queda más remedio que leer la documentación de wxWindows (para C++). Lo dicho, con buena voluntad se sale adelante. Sin embargo existe una aplicación de prueba fantástica que se puede descargar aquí. Se trata de una aplicación que muestra todos los widgets en acción junto con el código para lograr esos efectos. De verdad, ayuda mucho.

    Existe un proyecto de desarrollo de un RAD para Python utilizando wxPython. Su nombre es Boa y puedes probarlo aquí. Nunca lo he usado, pero parece que promete. Quizá cuando sea estable (aún es alpha) contribuya a la popularidad de Python.

    No me resisto de comentar otra aplicación. wxDesigner. Ni es libre, ni es gratuita pero ayuda bastante si trabajas con wxWindows y Python (o C++ o Perl). Puedes descargarte una versión de evaluación que no permite guardar documentos (o así era cuando lo bajé yo). Esta aplicación me pareció especialmente útil e interesante.

Bueno, me he olvidado deliberadamente de PythonCard por el desconocimiento que tengo de este proyecto. Si no me equivoco es un intento de simplificar el funcionamiento de wxPython con clases de más alto nivel.

Tan sólo para completar añadiría algunos GUIs más. Ya está comentado el Pythonwin (algo más que el IDE de python para windows) que emplea las MFC. Añadiría el anygui, un intento de agrupar varios interfaces gráficos en uno al estilo de la DB API2, y el PyFOX, basado en FOX, un toolkit multiplataforma para OpenGL. Del mismo estilo que FxPy, es PyFLTK, un wrapper del Fast Light ToolKit (FLTK), un toolkit multiplataforma (Windows, X11, MacOS X) en C++, del cual sus autores dicen que "provides modern GUI functionality without the bloat"

También está WPY, al estilo de anygui: soporta varias plataformas (Windows 3.x/9x/NT/2000 y UNIX) y en cada una ellas usa widgets "nativos" (en UNIX usa TK y en Windows las MFC).

La verdad es que hay un buen montón de wrappers, y herramientas como SIP o el mega-fantástico SWIG hacen que no sea demasiado complicado añadir nuevos.

Conclusión personal: En mi opinión, para programar aplicaciones multiplataforma Tkinter o wxPython. A estos dos entornos se les dedica un apartado en Python Programming on Win32. Aquí tienes el de Tkinter y el de wxPython

Si vas a realizar una aplicación para un sistema específico, Linux por ejemplo, podrías considerar PyQT o PyGTK. Sin embargo, son entornos muy grandes y la curva de aprendizaje, aunque menos pronunciada que en otros lenguajes, puede ser dura. Yo aprendería wxPython que sirve para casi todo (aunque no he encontrado nada para justificar el casi).

Un saludo