Interfaces Gráficas de Usuario en Python
Si bien en los últimos tiempos la mayoría de las aplicaciones corren "en la nube" y son accesibles a través de un navegador web, o están disponibles en una versión mobile, aún puedes encontrarte con la necesidad de desarrollar una que se ejecute localmente y que cuente con una interfaz gráfica de usuario amigable.
Para ayudarte en esta tarea Python te ofrece numerosas variantes, siendo las más conocidas:
- Tkinter
- PyQt
- wxPython
- PySimpleGUI
En los casos mencionados, se trata de wrappers de las librerías para la creación y manipulación de ventanas y objetos gráficos (widgets) con los que el usuario puede interactuar. Respectivamente: Tcl/Tk (https://www.tcl.tk/), Qt (https://www.qt.io/), wxWidgets (http://wxwidgets.org/) y todas ellas (https://pypi.org/project/PySimpleGUI/).
Probablemente la más utilizada es Tkinter, ya que al formar parte de la instalación estándar de Python y ser multiplataforma, facilita que las aplicaciones desarrolladas sobre un sistema operativo corran sin inconvenientes en otro. La capa adicional de orientación a objetos que ofrecen los paquetes de tkinter, principalmente ttk, hace que además sea muy sencillo escribir código para crear una GUI.
>>> from tkinter import *
>>> from tkinter import ttk
>>> root = Tk()
>>> root.title('Tkinter')
''
>>> root.geometry('200x120')
''
>>> etiqueta = ttk.Label(root, text='ttk.Label', font=('Courier', 18, 'bold'))
>>> etiqueta.pack()
>>> boton = ttk.Button(root, text='Soy un ttk.Button')
>>> boton.pack()
En el código precedente, primero creamos el elemento raíz (ventana), asignamos un título y definimos su tamaño.
Luego instanciamos dos widgets, uno de tipo ttk.Label y otro de tipo ttk.Button (nótese que ambas son clases del módulo ttk) y establecemos sus propiedades mediante parámetros con nombre que pasamos en el constructor, siendo siempre el primer argumento el widget padre.
Para posicionarlos, se usó la forma más simple del método pack()
A posteriori, es posible modificar las propiedades de los widgets a mediante la invocación de su método <widget>.config()
>>> style = ttk.Style()
>>> style.configure('RY.TButton', foreground='red', background='yellow')
>>> boton.config(style='RY.TButton')
En el ejemplo, y utilizando un objeto de la clase ttk.Style se modifica el aspecto del botón, a saber: el color de fondo se establece en amarillo y el del texto en rojo.
Tkinter y ttk ofrecen multitud de widgets para componer nuestra GUI, entre ellos:
- ttk.Label (etiquetas)
- ttk.Button (botones)
- ttk.Checkbuttons (opciones múltiples, no mutuamente excluyentes)
- ttk.Radiobuttons (opciones múltiples mutuamente excluyentes)
- ttk.Entry (texto editable por el usuario)
- ttk.Combobox (opciones desplegables)
- ttk.Spinbox (para ingreso de datos numéricos, con flechas de incremento y decremento)
- ttk.Progressbar (una barra de progreso programable)
- ttk.Notebook (un widget contenedor con pestañas)
- ttk.Treeview (para mostrar o generar estructuras jerárquicas de datos)
- Menú (menús para la aplicación)
- Text (ingreso de texto con opciones avanzadas de manipulación)
- Canvas (para la generación de gráficos)
- etc.
Por todas las características mencionadas, sumado a lo intuitivo y la facilidad que ofrece para la composición de GUI complejas, sea programadas en forma interactiva como en el ejemplo, o estructurada o bien usando OOP, Tkinter es una excelente herramienta para todo desarrollador en Python.