Crear una interfaz con PySimpleGUI

PySimpleGUI hace interfaces gráficas describiendo la ventana como una lista de filas. Por debajo usa tkinter, pero el código se queda en la mitad. Antes del ejemplo, conviene saber qué ha pasado con su licencia.

Su licencia, en cuatro fechas

FechaQué pasó
2018nace como software libre
Febrero de 2024la versión 5 pasa a ser comercial: hacía falta una clave para usarla
Febrero de 2025la empresa que lo mantenía anuncia su cierre
Abril de 2026la versión 6 vuelve a ser libre, con licencia LGPL3

Lo cuenta su autor en la página del proyecto en PyPI. Mientras tanto, la comunidad mantuvo una bifurcación libre, FreeSimpleGUI, que se usa igual cambiando el import. Si tu proyecto se quedó con alguna de esas dos, no tienes por qué cambiar.

Instalarlo

pip install PySimpleGUI

Esto instala la versión 6, la libre. La versión anterior de esta página añadía pip install tk, y eso hay que quitarlo: ese paquete no es tkinter, sino un proyecto distinto que se llama igual. PySimpleGUI necesita tkinter, que en Linux se instala con sudo apt install python3-tk.

Una ventana que saluda

import PySimpleGUI as sg

layout = [
    [sg.Text("Escribe tu nombre y pulsa el botón", key="-SALUDO-")],
    [sg.Input(key="-NOMBRE-", size=(30, 1))],
    [sg.Button("Saludar"), sg.Button("Salir")],
]
ventana = sg.Window("Hola, PySimpleGUI", layout)

while True:
    evento, valores = ventana.read()
    if evento in (sg.WIN_CLOSED, "Salir"):
        break
    if evento == "Saludar":
        texto = valores["-NOMBRE-"].strip() or "mundo"
        ventana["-SALUDO-"].update(f"¡Hola, {texto}!")

ventana.close()
Dos capturas de una ventana de PySimpleGUI con un campo de texto y los botones Saludar y Salir, antes y después de saludar a Ana
La misma ventana antes y después de pulsar «Saludar». Capturas de una ejecución real con PySimpleGUI 6.3 y Python 3.14.

Las tres ideas

La ventana es una lista de filas, y cada fila, una lista de controles. El código se parece a la ventana que vas a ver, y eso es lo que hace a PySimpleGUI tan fácil de leer.

El bucle es tuyo. ventana.read() espera hasta que pase algo y devuelve qué ha pasado —el texto del botón pulsado, o sg.WIN_CLOSED si se cerró la ventana— y los valores de todos los campos. Tú decides qué hacer y vuelves a esperar. Comparado con tkinter, donde cada botón tiene su función, aquí todo está en un mismo sitio.

Las claves identifican los controles. key="-NOMBRE-" sirve para leer el campo en valores["-NOMBRE-"] y para cambiarlo con ventana["-SALUDO-"].update(...). Los guiones alrededor son una convención del proyecto para distinguir claves de textos; no son obligatorios.

Comprueba siempre sg.WIN_CLOSED. Si el usuario cierra la ventana con la X y tu bucle no lo mira, read() sigue devolviendo eventos vacíos sin parar y el programa se queda en un bucle infinito consumiendo procesador.

Más información en inglés: Create an interface with PySimpleGUI.

Todo el código se ejecutó con Python 3.14 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.