Interfaz gráfica con Tkinter

Algo muy buscado en Python son las guías sobre interfaces gráficas ya sea PyGTK, PyQT, WxPython o Tkinter entre las mas conocidas teniendo cada una sus ventajas y desventajas, así como cada una tiene facilidades y complicaciones en su uso y aplicación. En esta oportunidad les daremos un espacio a Tkinter e intentaremos ser lo mas lo mas claro posible sin pasarnos por alto los pequeños detalles en lo que compone la creación de una interfaz gráfica en Python con el toolkit Tkinter.

Contenido:

Introduccion

Copyright:2015, Alvarez Alejandro
Version:0.1.1. (Descarga)

Puede descargar la versión más reciente de esta guía gratuitamente en la web https://github.com/eliluminado/tutorial_tkinter

Agradecimientos

Ante todo gracias a todos los lectores y a aquellos que me enviaron correos con consultas y sugerencias y desde ya a los ayudaron a mejorar esta guía

Creditos

Esta guia es escrita y mantenida por Alejandro Alvarez <eliluminado@codigopython.com.ar>

Colaboradores

Ninguno todavia. Por que no ser el primero?

LICENCIA

_images/Logo_Free_Cultural_Works.png

Este trabajo esta licenciado bajo la licencia de Creative Commons Atribución-CompartirIgual 4.0 Unported. Para ver una copia de esta licencia, visita http://creativecommons.org/licenses/by-sa/4.0/deed.es o envía una carta a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Historial de cambios

Version 0.1.2 (En desarrollo)

Añadidos

Correcciones

Version 0.1.1

  • Se retoma el desarrollo de la guia utilizado Sphinx como motor

Introduccion

Sean bienvenidos a esta noble guía que pretende a lo largo de sus capítulos mostrar las herramientas y conocimientos necesarios para el desarrollo de interfaces gráficas con las librerías Tk y el lenguaje de programación Python. El contenido de esta guía no pretende ser una referencia completa de lo que puede lograr pero si servir como una base al poco contenido que se logra encontrar en español sobre Tkinter.

Acerca de Tk

Tkinter es un binding de la biblioteca gráfica Tcl/Tk para el lenguaje de programación Python, con estos queremos decir que Tk se encuentra disponible para varios lenguajes de programación entre los cuales se encuentra Python con el nombre de Tkinter. Este no es mas que una adaptación de esta librería para el lenguaje Python con lo cual usar Tk en otro lenguaje no nos supondrá un inconveniente.

Se considera un estándar para la interfaz gráfica de usuario (GUI) para Python y es el que viene por defecto con la instalación para Microsoft Windows y preinstalado en la mayoría de las distribuciones de GNU/Linux. Con Tkinter podremos conseguir resultados casi tan buenos como con otras librerías gráficas siempre teniendo en cuenta que quizás con otras herramientas podamos realizar trabajos mas complejos donde necesitemos una plataforma mas robusta, pero como herramienta didáctica e interfaces sencillas nos sobrara, dándonos una perspectiva de lo que se trata el desarrollo de una parte muy importante de una aplicación si deseamos distribuirla. Gracias a Tkinter veremos como interactuar con el usuario pidiéndole el ingreso de datos, capturando la pulsación de teclas, movimientos del mouse, entre algunas de las cosas que podremos lograr.

Historia

Virtudes y limitaciones

Que es una interfaz grafica

Buenas practicas

Instalando Tkinter

Linux

Windows

Mac

Sobre esta guía

Para los que deseen colaborar con esta guía así como en su contenido, pueden hacerlo enviandome un correo electronico (eliluminado@codigopython.com.ar), de preferencia en español, o a traves de GitHub desde el canal para envio de fallos o correcciones desde la siguiente url: https://github.com/eliluminado/tutorial_tkinter/issues

Para los mas experimentados pueden colaborar realizando un fork de la guia y luego enviar los cambios entrando en https://github.com/eliluminado/tutorial_tkinter

Empezando por lo básico

Lo primero que debemos hacer al igual que con otros módulos, es que debemos importarlo para poder comenzar a utilizarlo, y al igual que con otros módulos no hay una sola forma de hacerlo.

La primer forma (y la mas popular):

Python 2.x

from Tkinter import *

Python 3.x

from tkinter import *

Y la segunda:

Python 2.x

import Tkinter

Python 3.x

import tkinter

Nota

En las versiones 3.x de Python el modulo Tk se debe llamar de esta forma “from tkinter import *” y no de esta otra forma “from Tkinter import *”, notar la t minuscula en el nombre, es un cambio menor que hay que tener en cuenta si están trabajando con Python 3.

La diferencia entre usar la primera o la segunda forma es la misma con la que nos podemos encontrar a la hora de importar un modulo en Python, para verlo les muestro esta diferencia utilizando al modulo ‘time’ y usamos el siguiente ejemplo:

1
2
import time
time.sleep(10)
1
2
from time import sleep
sleep(10)

Usando la forma “import Tkinter” cada vez que utilicemos una función de este modulo tendremos que anteponer la palabra ‘Tkinter’, en cambio usando la segunda forma “from Tkinter import *” simplemente deberemos usar el nombre de la función sin el nombre del modulo. Hay otras formas pero dependerá de tu forma de trabajar o la que te resulte mas cómoda, en todo caso puedes darle un vistazo a esta traducción de la guía de estilo escrita por Guido van Rossum y Barry Warsaw http://mundogeek.net/traducciones/guia-estilo-python.htm

Por ahora a modo didactico usaremos una variacion de la segunda forma para que los ejemplos sean mas claros, pero esto queda a tu eleccion. Ahora si retomemos nuestro camino.

Una observación que tendremos que tener antes de continuar es no debemos pasa por alto la posibilidad de que el usuario no tenga instalado las librerías de Tkinter y en consecuencia nuestra aplicación no podrá funcionar, lo mejor en este caso como en muchos otros es anticiparnos a los posibles errores que puedan ir surgiendo y manejar las excepciones de la siguiente forma:

Python 2.x

1
2
3
4
try:
    import Tkinter
except ImportError:
    raise ImportError("Se requiere el modulo Tkinter")

Python 3.x

1
2
3
4
try:
    import tkinter
except ImportError:
    raise ImportError("Se requiere el modulo tkinter")

Tambien podriamos ir un poco mas lejos y suponer que no sabemos que version esta usando el usuario y llevar el codigo de arriba para que sea compatible con ambas versiones de Python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import sys

PYTHON_VERSION = sys.version_info.major

if PYTHON_VERSION < 3:
    try:
        import Tkinter as tk
    except ImportError:
        raise ImportError("Se requiere el modulo Tkinter")
else:
    try:
        import tkinter as tk
    except ImportError:
        raise ImportError("Se requiere el modulo tkinter")

Otra forma igual de efectiva

1
2
3
4
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

La forma mas elegante y eficiente para mi gusto (Aclaro que solo es mi humilde opinion), es a traves de una libreria externa llamada six que la pueden bajar e instalar desde aqui https://pypi.python.org/pypi/six. Con esta podemos obtener la primer forma mostrada pero mas compacta. Dependera de ustedes si van a agregar librerias externas a su aplicacion.

1
2
3
4
try:
    from six.moves import tkinter as tk
except ImportError:
    raise ImportError("Se requiere el modulo Tkinter")

De esta forma en caso de que el potencial usuario de nuestra preciada aplicación, no pueda ejecutarla pueda saber cual es motivo (en este caso es que no tenga instalado Tkinter) por el cual no pudo iniciarla.

Una vez importado el modulo Tkinter correctamente podemos utilizarlo para crear nuestra primera ventana de la siguiente forma:

1
2
3
4
from six.moves import tkinter as tk

root = tk.Tk()
root.mainloop()

Estas lineas son fundamentales, ya que de ellas dependerá gran parte del contenido así como pueden ser botones y menús, aunque mas adelante conforme vayamos viendo temas mas avanzados podremos hacer uso de otras herramientas y técnicas.

En la primera linea (No tengamos en cuenta la importación vista anteriormente) se crea un identificador que sera el que utilizaremos para referirnos a la ventana, en este caso lo llamamos ‘root’ y es una de las funciones mas importantes de Tkinter. Siempre que iniciamos un identificador que en este caso lo llamamos ‘root’ debemos cerrarlo para capturar como veremos mas adelante los eventos.

Nota

Para que el codigo escrito sea mantenible se utilizara de ahora en adelante el modulo six, esto permite ignorar la version de Python utilizada.

Nota

La variable ‘root’ usada para nombrar al identificador, puede ser reemplazada por cualquier otro nombre siempre y cuando se respeten las palabras reservadas de Python, aunque es muy utilizado usar el nombre ‘root’ para la ventana principal y puede ser una buena practica para que resulte mas familiar a los demás programadores que se quieran unir al desarrollo de nuestra aplicación.

Con esto ya tendremos una ventana vacía que nos servirá para comenzar a trabajar, a partir de ahora iremos ampliando el contenido mostrando los distintos widgets con los que contamos en Tkinter y luego para finalizar crearemos un ejemplo sencillo para unir lo se vio a lo largo de este material.

Indices and tables