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.



34 pensamientos en “Interfaces gráficas de usuario en Python”

  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.

  2. 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.

    1. 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.

  3. 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

  4. 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/

  5. @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?

  6. 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.

  7. 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 ^_^

  8. 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.

  9. [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.

  10. Pingback: links for 2008-11-25 | <tech.kedesfase.com>

  11. Pingback: Interfaces gráficas de usuario en Python « Un Bioinformatiquillo

  12. 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

  13. Pingback: PySide: El PyQt LGPL

  14. 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! 🙂

  15. 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.. 😀

  16. 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?

  17. 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 !

  18. 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

  19. 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.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.