Interfaces gráficas de usuario en Python

En esta entrada veremos algunos de los toolkits para creación de interfaces gráficas de usuario (GUIs) con Python más populares: TkInter, wxPython, PyGTK y PyQt.

TkInter

TkInter (de TK Interface) es un módulo que nos permite construir interfaces gráficas de usuario multiplataforma en Python utilizando el conocido toolkit Tk. Python incluye este módulo por defecto, lo que hace que sea un tookit muy popular. TkInter, además, es robusto, maduro y muy sencillo de aprender y de utilizar, contando con una amplia documentación.

Por otro lado hasta la versión 8.5 Tk era famoso por lo poco atractivo de sus widgets (cosa que se podía solucionar hasta cierto punto gracias a Tile). No es hasta esta versión que contamos con cosas tan básicas como textos con antialiasing en X11 o widgets como Treeview. En esta versión también se incluye Tile por defecto, por lo que contamos con un mejor aspecto general para todas las plataformas.

Sin embargo Python no se distribuye con Tk 8.5 hasta la versión 2.6, por lo que, para versiones de Python anteriores, es necesario recompilar TkInter para Tk 8.5 por nuestra cuenta, o bien usar Tile si no necesitamos ninguna de las nuevas características.

Es más, para poder usar la mayor parte de las nuevas características de Tk 8.5 es necesario instalar una librería que actúe como wrapper de Ttk (el nombre con el que han dado en llamar al conjunto de los nuevos widgets y temas de Tk), como puede ser pyttk.

TkInter se distribuye bajo la PSFL (Python Software Foundation License) una licencia compatible con la GPL creada para la distribución de software relacionado con el proyecto Python. La PSFL carece de la naturaleza viral de la GPL, por lo que permite crear trabajos derivados sin que estos se conviertan necesariamente en software libre.

Por último, veamos una pequeña aplicación de ejemplo escrita con TkInter, sin uso de eventos y con solo unos pocos widgets, que nos servirá para comparar el aspecto de los distintos toolkits.

from Tkinter import *

root = Tk()

frame = Frame(root)
frame.pack()

label = Label(frame, text="Hola mundo")
c1 = Checkbutton(frame, text="Uno")
c2 = Checkbutton(frame, text="Dos")
entry = Entry(frame)
button = Button(frame, text="Aceptar")

label.pack()
c1.pack()
c2.pack()
entry.pack()
button.pack()

root.mainloop()

GUIs en Python con TkInter

Pros: Popularidad, sencillez, documentación.
Contras: Herramientas, integración con el sistema operativo, lentitud.
Recomendado para: ¿Prototipos rápidos?

wxPython

wxPython es un wrapper open source para el toolkit anteriormente conocido como wxWindows: wxWidgets. wxPython es posiblemente el toolkit para desarrollo de interfaces gráficas en Python más popular, superando incluso a TKinter, que, como comentamos, se incluye por defecto con el intérprete de Python. wxPython cuenta con más y mejores widgets que TKinter, y ofrece un muy buen aspecto en todas las plataformas, utilizando MFC en Windows y GTK en Linux.

wxPython cuenta además con herramientas muy interesantes como wxGlade, una aplicación RAD para diseñar las interfaces gráficas de forma visual.

Sin embargo, la API adolece de una cierta falta de consistencia y un estilo muy alejado de Python y más cercano a C++, ya que, de hecho, uno de sus objetivos es no distanciarse demasiado del estilo de wxWidgets. Esto ha provocado que hayan aparecido distintos proyectos para abstraer al programador de los entresijos del toolkit, como Dabo o Wax, aunque estos han tenido un éxito muy comedido.

Tanto wxPython como wxWidgets se distribuyen bajo una licencia “wxWindows Licence”, que consiste esencialmente en una LGPL con la excepción de que las obras derivadas en formato binario se pueden distribuir como el usuario crea conveniente.

Algunos ejemplos de aplicaciones conocidas creadas con wxPython son DrPython, wxGlade, Boa Constructor, Stani’s Python Editor y ABC.

Finalmente, a continuación podéis consultar el código de la aplicación de ejemplo:

import wx

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None)
        panel = wx.Panel(self)
        text = wx.StaticText(panel, -1, "Hola mundo")
        c1 = wx.CheckBox(panel, -1, label="Uno")
        c2 = wx.CheckBox(panel, -1, label="Dos")
        t = wx.TextCtrl(panel)
        b1 = wx.Button(panel, -1, label="Aceptar")
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text, 0, wx.ALL, 0)
        sizer.Add(c1, 0, wx.ALL, 0)
        sizer.Add(c2, 0, wx.ALL, 0)
        sizer.Add(t, 0, wx.ALL, 0)
        sizer.Add(b1, 0, wx.ALL, 0)
        panel.SetSizer(sizer)
        panel.Layout()

app = wx.App(redirect=True)
Frame().Show()
app.MainLoop()

GUIs en Python con wxPython

Pros: Popularidad, herramientas, multiplataforma.
Contras: API muy poco pythonica.
Recomendado para: Desarrollo multiplataforma.

PyGTK

Posiblemente PyGTK sea la segunda opción más utilizada para la creación de interfaces gráficas con Python, solo por detrás de wxPython, con la que compite de tú a tú. PyGTK, como podemos suponer por su nombre, es un binding de GTK, la biblioteca utilizada para desarrollar GNOME.

PyGTK cuenta con una API muy clara, limpia y elegante y es, además, muy sencillo de aprender, solo superado en ese aspecto por Tkinter. PyGTK también cuenta con grandes herramientas para construir la interfaz de forma gráfica, como Glade o Gazpacho.

Un punto negativo es que, hasta hace poco, era necesario instalar X11 para poder usar PyGTK en Mac OS, dado que GTK no había sido portado. Actualmente se puede utilizar el GTK+ OS X Framework que se encuentra todavía en versión beta.

PyGTK se distribuye bajo licencia LGPL.

Algunas aplicaciones escritas con PyGTK son Deluge, Exaile, Listen, Envy, WingIDE, DeVeDe o emesene.

Veamos el código de la aplicación de ejemplo en PyGTK:

import pygtk
import gtk

window = gtk.Window(gtk.WINDOW_TOPLEVEL)    
window.connect("destroy", gtk.main_quit)

box = gtk.VBox(False, 0)
window.add(box)
    
label = gtk.Label("Hola Mundo")
c1 = gtk.CheckButton(label="Uno")
c2 = gtk.CheckButton(label="Dos")
entry = gtk.Entry()
button = gtk.Button("Aceptar")

box.add(label)
box.add(c1)
box.add(c2)
box.add(entry)
box.add(button)

window.show_all()

gtk.main()

GUIs en Python con PyGTK

Pros: Popularidad, sencillez, herramientas.
Contras: Ligeramente más complicado de instalar y distribuir en Mac OS.
Recomendado para: Cualquier tipo de aplicación. Especialmente interesante para Gnome.

PyQt

Es posible que PyQt, el binding de Qt para Python, sea la menos popular de las cuatro opciones, aunque es un toolkit sencillo de utilizar y con muchas posibilidades. Es especialmente interesante para el desarrollo en KDE, dado que Qt es la librería utilizada para crear este entorno.

No obstante el interés en Qt no se limita a KDE, sino que es una biblioteca multiplataforma que, además, desde la versión 4, utiliza widgets nativos para las distintas plataformas (anteriormente Qt emulaba el aspecto de la plataforma en la que corría).

Como aplicación de RAD se puede utilizar Qt Designer.

PyQt utiliza un modelo de licencias similar al de Qt, con una licencia dual GPL/PyQt Commercial. Si nuestro programa es compatible con la licencia GPL, es decir, si vamos a publicar el código fuente y permitir a los usuarios modificar nuestra aplicación, podremos usar PyQt sin más preocupaciones. En caso contrario tendremos que pagar para obtener una licencia comercial.

Un par de ejemplos de aplicaciones que usan PyQt son Eric y QTorrent.

El código de la aplicación de ejemplo en PyQt tendría el siguiente aspecto:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Form(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        layout = QVBoxLayout()
        layout.addWidget(QLabel("Hola mundo"))
        layout.addWidget(QCheckBox("Uno"))
        layout.addWidget(QCheckBox("Dos"))
        layout.addWidget(QLineEdit())
        layout.addWidget(QPushButton("Aceptar"))

        self.setLayout(layout)


app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

GUIs en Python con PyQt

Pros: Sencillez, herramientas, multiplataforma.
Contras: Ligeramente más complicado de instalar y distribuir en Mac OS. Licencia.
Recomendado para: Cualquier tipo de aplicación. Especialmente interesante para KDE.



Comentarios
  1. Aviso: esta entrada hay que tomarla con un grano de sal, porque puedo no ser del todo objetivo y tampoco soy un experto en todos los toolkits, evidentemente.

    Asi que si alguno veis algún error o tenéis una opinión diferente sobre cualquier punto, no tenéis más que explicarlo.

    Responder

  2. LaPeGa

    Muchas gracias!

    Responder

  3. ig

    No creo que la licencia dual de Qt/PyQT sea una desventaja ni mucho menos. Con ella se fuerza a los desarrolladores a colaborar con código o con dinero.

    Lo que si es una desventaja son aquellos desarrolladores que se aprovechan del trabajo de los demás y no aportan nada a la comunidad.

    Responder

    • PetBANG

      Sin ánimo de ofender creo que hay que cambiar el chip. No se puede controlar quien usa o no de forma constructiva una herramienta. La filosofía de aportar es insostenible si obligamos a ello. Precisamente el daño no está entre nosotros., está en la grandes compañías que se aprovechangracias a sus recursos de programadores y al fin de al cabo el éxito y dinero se lo llevan ellos. Además para colmo patentan y crean copyright. Debemos incentivar el uso de herramientas bajo protección de código abierto siempre aportará más a todos. Al fin de al cabo son las grandes mentes son recursos las que nos hacen dar los saltos. Nunca sabemos donde están esas mentes.

      Responder

  4. Una pincelada muy interesante, no conocía TkInter.

    Es curioso también el asunto de la presentación de los temas (al menos en XP) ya que para un código aparentemente similar no existe un interfaz que de una salida similar (dependiendo de la librería que utilices).

    No estoy seguro, pero tal vez ajustando temas de pieles se pueda llegar a dar el mismo aspecto que una aplicacion de XP (hecha por ejemplo con Visual Basic).

    Saludos

    Responder

  5. name

    Usuario de GNOME,se nota. Siempre difamando con falacias.
    “Qt cuenta actualmente con un sistema de triple licencia: GNU v2 y GNU v3 para el desarrollo de software de código abierto (open source) y software libre, y otra de pago para el desarrollo de aplicaciones con cualquier licencia.

    Actualmente se encuentra la versión 4 de la biblioteca, y además de las múltiples mejoras, ahora las bibliotecas Qt son también liberadas bajo licencia GNU para Windows y Mac.”
    http://es.wikipedia.org/wiki/Qt_(biblioteca)

    Además, te faltó PyKDE:
    http://pykde.sourceforge.net/

    Responder

  6. @name Soy usuario de GNOME, si, pero no tengo nada en contra de KDE, no soy ningún fanboy.

    Yo no me dedico a difamar, así que faltas de respeto y salidas de tono, las justas. La próxima vez no pienso avisar.

    ¿En qué se diferencia tu cita de la licencia que he escrito yo que usa?

    PyKDE no se menciona porque, como puedes leer claramente en la primera frase del artículo, este trata de los toolkits más populares. Si buscas PyQt en Google obtienes 650.000 resultados. Si buscas PyKDE, 90.000. ¿Captas la idea?

    Responder

  7. Manuel

    ni caso raul se nota que el tipo no siquiera se molesto en leer. es muy bueno el post y me encanta tu tutorial de python.
    yo tuve que decidir que toolkit usar hace un par de meses y me decidi por pygtk y por lo que veo fue una buena eleccion.
    sigue asi figura.

    Responder

  8. razpeitia

    Nada mejor que crear tus interfaces en sdl, eso si es rapido y multiplataforma 😉

    Responder

  9. Chuche

    Muchas gracias por el tutorial, se me hace muy interesante, ya que estoy comensando en python, algun tutorial que me recomienden para aprender mas rapido ^_^

    Responder

  10. alcuadrado

    muy buen articulo 🙂

    Responder

  11. grial313

    PyGtk es muy buena opción, Ya tengo es fase de desarrollo toda una aplicación para la gestión de negocios comerciales y la experiencia ha sido buena.

    Recomiendo Pygtk además por que poner a funcionar las aplicaciones gtk en window es muy fácil, tan solo como entrar a la pagina de pygyk y bajar los instaladores.

    Si alguna duda a la orden.

    Responder

  12. [Usando teclado US]
    Respecto a TK solo queria anadir que es interesante que surgio como una extension a TCL, y que fue desarrollado por el mismo desarrollador de TCL (John Kenneth Ousterhout). TCL es un lenguaje scripting fantastico para prototyping y hacer potentisimos wrappers para otras herramientas. Ademas de ser increible para proveeer API en tu programa.
    En HW design se utiliza muchisimo.
    Es curioso ver el desarrollo de Python y TCL, que sugieron a ppo. de los 90, uno se hizo un lenguaje de nicho y otro bueno que voy a decir de Python.
    Una putada que “Active state” haya llevado TCL al bando “sacar pasta como sea”, ya que ahora la library ActiveTCL, que incorpora unos paquetes geniales, tienen una locura de licencia. Open source, free to use, not distributable, lo cual es un chiste pq muchos de los paquetes que agrupa son recogidos de otros desarrolladores y estan bajo gpl v2 o equivalentes.

    Recomiendo usar TCL, ya que es curioso como en algunos casos usando muchos de las available libraries se consigue un resultado mucho mejor que con las Java libraries. Un ejemplo es XML(XSLT o XML parsers) , ya que “tdom” es increiblemente mas rapido que la mayoria de las Java libraries que he probado.

    Responder

  13. […] Interfaces gráficas de usuario en Python Un dia de estos me tengo que poner en serio con el python. (tags: python) […]

    Responder

  14. […] Noviembre 29, 2008 in UncategorizedTags: Python, Ubuntu/Linux Fuente: MundoGeek […]

    Responder

  15. ignis

    Wow, que post, justo lo que estaba buscando para iniciarme en python sobre xp. Gracias.

    Responder

  16. jorge

    hola sera que puedes hacer un post donde expliques detalladamente la instalacion de gtkmm con c++ es que e buscado por todos lados y no consigo como me harias un gran favor

    disculpa si es mucho pedir pero es que estoy tan urgido de esas librerias
    gracias de antemano

    Responder

  17. jorge

    se me olvido instalarlo en windows vista o xp

    Responder

  18. […] es un nuevo binding creado por Nokia para el uso de Qt en Python, con licencia LGPL. Etiquetas: programacion, pyqt, pyside, python, qt […]

    Responder

  19. Tavo De Chivix

    Que buen pantallazo general!

    Responder

  20. Dani

    Gracias, estaba buscando algo así.

    He probado en Windows 7 64bits: TkInter y wxPython y funcionan perfectamente

    un saludo

    Responder

  21. Muchas gracias estoy empezando y voy a probar todas a ver cual es mejor en todos los sentidos para mi gusto claro

    Responder

  22. Buen artículo.

    Saludos,

    Responder

  23. Soy desarrollador desde hace ya unos cuantos años. Desde la época en que 4MB en RAM y 25MHz eran sinónimo de PCs bestiales.

    Desde esos tiempos he desarrollado en unos cuantos lenguajes, unos cuantos de ellos clones o hijos de XBase, algunos de BASIC, algo de PHP, un poco de JS y desde hace unas pocas horas, decidí meterme con Python. Admito, eso si, que mi incursión es más por mera curiosidad que por una necesidad real.

    Hasta ahora me hallo gratamente sorprendido, sin embargo aún no le encuentro un punto sencillo de entrada al desarrollo. Ya bajé tu libro y unos cuantos tutoriales. Me he decantado por usar PyGTK debido a que los desarrollos que actualmente enfrento usan esa API. Además de conocerla un poco (no mucho para mi gusto), pues ya conozco la filosofía de esta.

    Por ahora me dedicaré a seguir estudiando y, quien sabe, un día de estos te envíe algo que haya hecho.

    ¡Saludos desde Venezuela! 🙂

    Responder

  24. En mi opinion, PyGTK es bueno pero en el momento de usarlo en Windows puede resultar complicado para el usuario final, PyQt se acomoda a la interfaz en la que este trabajando el usuario, ademas deja manipular el diseño de los widgets con CSS, y por eso me gusta mas…
    esa es mi opinion, pero cada quien con sus gustos.. 😀

    Responder

  25. Muchas gracias ahora ya comprendo mejor python

    Responder

  26. Rulz

    Hola, he decidido usar Tkinter para hacer una pruebita. Y bueno tengo una duda, muy estupida creo, y es que si yo pongo un input de texto, que introduzca el precio, como hago para que calcule ese precio con iva y lo muestre en una ventanita de alerta, o de la forma que quede mas visual?

    Responder

  27. ir1s

    Muy interesante el artículo, gracias.

    Hay algo importante que no veo en el artículo: la fecha de publicación, e igualmente de los comentarios.

    Saludos !

    Responder

  28. Jose

    Todos estos toolkits son compatibles con python 3?

    Gracias.

    Responder

  29. LEYNER

    MUchaas gracias por el aporte.
    Soy nuevo en esto y este post me salvo la vida 🙂

    Responder

  30. Hector

    Los ejemplos que estan ahí son para python 3.3 o para versiones 2.x. Muchas gracias por el blog.

    Responder

  31. Alejandro

    Hola muchas gracias por los ejemplos de referencia

    Sin embargo las interfaces con Wx y PyQT no se mostraron correctamente, al parecer porque no tengo incluidas las librerias .

    Saben donde puedo encontrarlas ??
    Esto me paso usando la version 3.3.3

    Gracias

    Responder

  32. Alberto

    Hola, soy electronico, no informatico, y estoy recien tratando de aprender Python para utilizarlo en control e interfases de comunicacion con microcontroladores, y este tipo de articulos me resulta muy util e interesante, felicitaciones.

    Responder

Deja un comentario