Advertising:
Ejemplo básico de interface gráfica de usuario con Python
Para hacer interfaces gráficas de usuario en python, con botones, listas, menús, etc, hay muchas librerías de componentes disponibles. En http://wiki.python.org/moin/GuiProgramming tienes una lista con un montón de ellas.
Sin embargo, Python viene por defecto con TkInter, por lo que para usarla no es necesario descargarse ningún paquete adicional. Vamos a ver aquí un ejemplo simple, una ventana con un botón que al pulsarlo escribe "hola" en un campo de texto. Vamos a ello.
Primero, debemos importar los componentes de la librería TkInter, para poder tenerlos disponibles
from Tkinter import *
Luego creamos la ventana principal de nuestra aplicación. Frame es uno de los componentes que nos proporciona TkInter y es una ventana (la ventana principal de la aplicación)
frame = Frame()
Para el campo de texto usaremos el componente Entry de Python. Este componente permite meter o visualizar una línea de texto simple. Para múltiples líneas debemos usar Text.
Cuando creemos nuestro campo de texto, necesitamos crear una variable de tipo StringVar. Esta variable simplemente contiene dentro una cadena de texto y le diremos a nuestro campo de texto que coja y deje el texto dentro de esa variable. La forma de hacer esto es sencilla
v = StringVar() campoTexto = Entry(frame, textvariable=v)
Con esto hemos creado la variable v de tipo StringVar y luego hemos creado el campoTexto de tipo Entry. Los parámetros son el frame donde queremos que vaya este campo de texto y con textvariable=v indicamos cual es la StringVar donde queremos que deje el texto escrito por el usuario o en el que queremos dejar nosotros el texto que se muestre. Los métodos v.get() y v.set() nos permitirán obtener o fijar este texto.
Para el botón, usaremos el componente Button de Python.
boton = Button(frame, text="hola", command=funcion)
donde frame es la ventana en la que queremos que esté el botón, text="hola" es el texto que queremos que presente el botón y command=funcion es la función que queremos que se ejecute cuando pulsemos el botón. Por supuesto, debemos tener creada previamente una función de nombre funcion(), así que antes de crear el botón, debemos definir la función
def funcion(): v.set("Hola")
Esta función simplemente pone "Hola" dentro del StringVar que asociamos previamente al campo de texto Entry. Cuando se ejecute esta función, se meterá dentro de v un texto "Hola" y este se mostrará en el campo Entry de la ventana.
El código completo de esta pequeña aplicación puede ser el siguiente
from Tkinter import * def funcion(): v.set("Hola") frame = Frame() button=Button(frame, text="hola", command=funcion) button.pack(side=LEFT) v = StringVar() text = Entry(frame, textvariable=v ) text.pack(side=LEFT); frame.pack() frame.mainloop()
Nos quedan por explicar un par de detalles.
Para cada widget creado (Button, Entry y Frame) necesitamos llamar a su método pack() para que coja las dimensiones adecuadas y se coloque en su sitio dentro de la ventana. Podemos o no poner parámetros a esta llamada, para dejar las opciones por defecto o decidir nosotros la localización. En el ejemplo, hemos puesto side=LEFT para que el botón y el campo de texto aparezcan alineados en horizontal.
Una vez terminado el programa, para siga activo y la ventana funcionando, debemos meternos en el bucle principal de tratamiento de eventos de frame. Es decir, hacemos la llamada a frame.mainloop(). Si no lo hacemos así, el programa termina inmediatamente y no veremos nada (salvo que escribamos línea a línea en el intérprete de python). Esta llamada lo único que tiene dentro es un bucle infinito, en el que va recogiendo los eventos de teclado o ratón para "despacharlos" a los componentes de la ventana y que estos puedan tratarlos, por ejemplo, el click sobre el botón.
Enlaces externos[edit]
- foro de python
- Página de TkInter: http://wiki.python.org/moin/TkInter
- Referencia de TkInter: http://infohost.nmt.edu/tcc/help/pubs/tkinter/
- Buen tutorial de geometry managers (grid, pack y place) en http://effbot.org/tkinterbook/grid.htm (ir pulsando next)