Interfaces Gráficas (GUI)

Advertencia: Esta página esta basada (en parte) en opiniones y experiencias personales de distintas personas. YMMV

Existen varias librerias que implementan interfaces gráficas de usuario (GUI) en python, las principales son:

Tabla comparativa

Caracteristica

Tkinter

WxPython

PyQT

PyGTK

Portabilidad

Windows/Linux/Mac

Windows, Linux (GTK+/X11/Motif), Mac OS X

Windows, Linux, Mac OS X

Windows, Linux, Mac OS X (via servidor de X)

Apariencia

"alien" en todos

nativa en todos

nativa en linux y windows

nativa en linux

Orientación/Influencias

Motif

Windows

KDE

GNOME

Diseñador "Visual"

GUI Builder (Komodo)

wxFormBuilder/wxGlade/XRCed

QT Designer

Glade, Gazpacho

IDEs Python

IDLE

SPE, BoaConstructor, DrPython

Eric4

??

Formato XML

No

sí (XRC incorporado)

??

sí (vía libglade antes, GTKBuilder ahora)

Otras facilidades

??

soporte para imagenes (BMP, PNG, JPG, etc.), visualización e impresión de HTML, clipboard y drag and drop, ayuda en linea, libreria de graficación de objetos ("vectoriales"), OpenGL, texto enriquecido (RTF) y "estilizado" (STC), programación en red, flujos, multitarea, bases de datos, unicode, gizmos varios, animaciones y multimedia

hilos, control de procesos en segundo plano, renderización de svg, definición de aspectos estéticos de la GUI con CSS, personalización de la app en js, sockets, acceso a base de datos, pareso de XML, OpenGL

Pango (texto multilingual), Cairo (gráficos 2D), ATK (accesibilidad)

Documentación

Excelente

Buena

Regular

Limitada

Ejemplos

??

Excelente (200 simples y 10 complejos)

Bueno (20 simples y 20 complejos)

??

Licencia

PSFL

LGPL

GPL (o PySide que es LGPL)

LGPL

Características comunes

Ventajas y Desventajas

Tkinter

Nota **: cabe aclarar que las ultimas versiones de TCL/TK mejoran varios de estos puntos, dibujando con las funciones nativas de la plataforma, lo que acelera y mejora la apariencia.

WxPython

PyQt

PyGTK

Hello World

Nota: para poder comparar, los ejemplos crean una aplicación, ventana y botón, con un evento.

Hay mas ejemplos en el Recetario#Interfaces_graficas

TkInter

from Tkinter import *

class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.hi_there = Button(frame, text="Hola", command=self.say_hi)
        self.hi_there.pack(side=LEFT)
    def say_hi(self):
        print "hola todo el mundo!"

root = Tk()
app = App(root)
root.mainloop()

WxPython

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title )
        btn = wx.Button(self, -1, "Hola")
        self.Bind(wx.EVT_BUTTON, self.say_hello, btn)

    def say_hello(self,*arg):
        print "hola todo el mundo!"

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, "Simple wxPython App")
        frame.Show(True)
        return True
MyApp().MainLoop()

PyQt

from PyQt4 import QtCore, QtGui
import sys

class MiVentana(QtGui.QWidget):
    def __init__(self, padre = None):
        super(MiVentana, self).__init__(padre)
        self.button = QtGui.QPushButton("Hola",self)
        self.connect(self.button, QtCore.SIGNAL("clicked()"), self.say_hello)
        self.show()
    def say_hello(self,**kwargs):
        print "hola mundo!"

app = QtGui.QApplication(sys.argv)
v = MiVentana()
app.exec_()

PyGTK

import pygtk
pygtk.require('2.0')
import gtk

class HelloWorld:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.button = gtk.Button("Hello World")
        self.button.connect("clicked", self.say_hello, None)
        self.window.add(self.button)
        self.button.show()
        self.window.show()

    def main(self):
        gtk.main()

    def say_hello(self, widget, data=None):
        print "Hello World"


hello = HelloWorld()
hello.main()

(sin testear)

Referencias

InterfacesGraficas (última edición 2011-01-27 13:03:48 efectuada por DanielMoisset)

USLA