Interfaz gráfica con Tkinter
26/09/2013
Inter faz gráfi faz gráfica ca con Tkinter Codigo Python [contacto@codigopython. [
[email protected] com.ar] .ar] Ultima modifica modificación ción 29-07-2013 Licencia: Este trabajo esta esta licenciado licenciado bajo la licencia de Creative Commons Atribución-CompartirIgual 3.0 Unported. Para ver una copia de esta licencia, visita licencia, visita http://creativec http://creativecommons.org/licenses/by-sa/3.0/deed.es ommons.org/licenses/by-sa/3.0/deed.es o o envía envía una carta a Creative Crea tive Commons, 171 Second Se cond Street, Suite 300, San San Francisco, California, 94105, USA. Puede descargar descargar la versión versión más reciente rec iente de esta es ta guía guía gratuitamente en la web htt https://githu ps://github.com/elilumin b.com/eliluminado/Guia-Tkinter ado/Guia-Tkinter Agradecimientos Agradecimientos Ante Ante todo gracias a todos todos los lectores lectores y a aquellos aquellos que me enviaron enviaron correos con consultas consultas y suguerencias suguerencias y desde ya ya a los los ayudaron ayudaron a mejorar esta guia moisesicaza moisesica za lordcaos Algo muy muy buscado en Python Python son las guí guías sobre interf interfaces aces gráficas ya sea PyGTK, PyGTK, PyQT, PyQT, WxPyth WxPython on o Tkinter Tkinter entre entre las las mas conocidas conocida s teniendo cada cad a una sus ventajas ventajas y desventajas, desventajas, así como cada una tiene facilidades facilida des y complicaciones complica ciones 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 alto los pequeños p equeños detalles en lo que compone c ompone la creación crea ción de una una interfaz gráfica en Python Python con el toolkit Tkinter.
1. Índice 1. Índice 2. Introducción 2.1. Acerca de Tk 2.1.1. Historia 2.1.2. Virtudes y limitaciones 2.2. Que es una interfaz grafica 2.3. Instalando Tkinter 2.3.1. Linu Li nuxx 2.3.2. Windows 2.3.3. Mac 2.4. Sobre esta guía 3. Empezando por lo básico 4. Widgets 4.1. Etiquetas [Label] 4.2. Botones Bo tones [Button] [Button] 4.3. Cuadro de texto [Entry] 4.3.1. Índice Índicess 4.3.2. Métodos 4.3.3. Validando Valida ndo un campo de texto 4.4. Casillas de verificacion [Checkbutton] 4.4.1. Métodos 4.5. Campo Ca mpo de text texto o multilinea [Text] [Text] 4.6. Opciones 4.6.1. activebackground 4.6.2. activeborderwidth 4.6.3. activeforegroun activeforegro und d 4.6.4. anchor 4.6.5. background (bg) 4.6.6. bitmap 4.6.7. borderwidth (bd) 4.6.8. command 4.6.9. cursor 4.6.10. compoun compo und d 4.6.11. default 4.6.12. disabledbackground 4.6.13. disabledforeground 4.6.14. exportselection 4.6.15. font http://eliluminado.alwaysdata.net/Guia Tkinter
1 / 33
Interfaz gráfica con Tkinter
26/09/2013
4.6.16. foreground (fg) 4.6.17. height 4.6.18. highlightbackgroun highlightbackgro und d 4.6.19. highlightcolor 4.6.20. highlightt highlightthickness hickness 4.6.21. image 4.6.22. indicatoron 4.6.23. insertbackground 4.6.24. insertborderwidth 4.6.25. insertofftime 4.6.26. insertontime 4.6.27. insertwidth 4.6.28. jump 4.6.29. justify 4.6.30. offrelief 4.6.31. offvalue 4.6.32. onvalue 4.6.33. orient 4.6.34. overrelief 4.6.35. padx 4.6.36. pady 4.6.37. relief 4.6.38. repeatdelay 4.6.39. repeatinterval 4.6.40. selectbackground 4.6.41. selectborderwidth 4.6.42. selectcolor 4.6.43. selectforegroun selectforegro und d 4.6.44. selectimage 4.6.45. setgrid 4.6.46. state 4.6.47. takefocus 4.6.48. text 4.6.49. textvariable 4.6.50. tristateimage 4.6.51. tristatevalu tristatevalue e 4.6.52. troughcolor 4.6.53. un underline derline 4.6.54. variable 4.6.55. width 4.6.56. wraplength 4.6.57. xscrollcomman xscrollcommand d 4.6.58. yscrollcomman yscrollcommand d 4.6.59. Disponibles para 4.7. Variables 5. Gestión del diseño 5.1. Métodos 5.1.1. iconify 5.1.2. deiconify 5.1.3. title 5.1.4. geometry 5.1.5. maxsize 5.1.6. minsize 5.1.7. state 5.1.8. resizable 5.1.9. withdraw 5.1.10. transient 5.2. Gestión de la geometría 5.2.1. pack 5.2.2. grid 5.2.3. place 5.3. Frame 5.4. Colores 5.4.1. Nombres de colores 5.4.2. RGB hexadeci hexadecimal mal 5.4.3. Consejos 5.5. Fuentes 5.6. Unidades Unidades de medida 5.7. Imágenes 5.7.1. PhotoI P hotoImage mage 5.7.2. PIL http://eliluminado.alwaysdata.net/Guia Tkinter
2 / 33
Interfaz gráfica con Tkinter
26/09/2013
6. Menú Menúss y barras de herramientas 7. Vent Ventanas anas de diálogos 8. Eventos 9. Ejemplos Avanzados 10. Notas finales 11. Enlaces de interés 12. Glosario 13. Anex Anexos os 13.1. Colores 14. Licencia
2. In Introducción troducción Sean bienven bi envenidos idos a esta noble guía que pretende a lo largo de sus capítulos capítulos mostrar las herramientas y conocimientos necesarios necesa rios para el desarrollo de sarrollo de interfaces i nterfaces gráficas con las librerías Tk y el lenguaje enguaje de programación progra mación Python. Python. El contenido de esta es ta guía 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. Tki nter.
2.1. Acerca de Tk Tkinter es un binding binding de de la biblioteca gráfica Tcl/Tk para el lenguaje de programación Python, con estos queremos decir que Tk se encuentra encuentra disponible disp onible para varios lenguajes de prog programació ramación n entre entre los cuales se encuen e ncuentra tra Python Python con el nombre de Tkinter. Este no es mas que una adaptación adaptaci ón de esta es ta librería para el lenguaje lenguaje Python con lo cual usar usar Tk en otro lenguaje no nos supondrá un inconveniente. Se considera co nsidera un estándar para la interfaz i nterfaz gráfica de usuario (GUI) (GUI) para Pyth P ython on y es el que viene por defecto con la instalació n para Microsoft Microso ft Windows y preinstalado en la mayoría mayoría de las distribucio d istribuciones nes de GNU/Linux. GNU/Linux. Con Tkinter Tkinter podremos podre mos 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.
2.1.1. Historia 2.1.2. Virtudes y limitaciones
2.2. Que es una interfaz grafica 2.3. Instalando Tkinter 2.3.1. Linux 2.3.2. Wi Windows ndows 2.3.3. Mac
2.4. Sobre esta guía Para los que deseen desee n colaborar con esta guí g uía a así como en su conten contenido, ido, pueden puede n hacerlo hacerlo registrándose reg istrándose en e n el Foro Foro o o desde su repositorio en GitHub htt https://githu ps://github.com/elilumin b.com/eliluminado/Guia-Tkinter ado/Guia-Tkinter
3. 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 una sola forma de hacerlo. La primer pri mer forma (y la mas popular): from Tkinter import *
Y la segunda: import Tkinter
NOTA En las versiones 3.x de Python el modulo Tk se debe llamar de esta forma "from Tkinter import *" y y no no de esta e sta otra forma "from http://eliluminado.alwaysdata.net/Guia Tkinter
3 / 33
Interfaz gráfica con Tkinter
26/09/2013
Tkinter import *" , 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: import time time.sleep(10) 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/guiaestilo-python.htm Por ahora a modo didactico usaremos 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: try: import Tkinter 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 puede 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: import Tkinter root = Tkinter.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) 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 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.
4. Widgets En esta sección no nos centraremos en el posicionamiento y diseño de los elementos que compondrán nuestra interfaz gráfica, lo dejaremos para la siguiente sección "Gestión del diseño" en donde se vera mas detenidamente este asunto.
4.1. Etiquetas [Label] Para comenzar a llenar esa vacía ventana que acabamos de crear vamos a nombrar a las etiquetas o mas conocidas como 'label' por su nombre en ingles, las podemos encontrar desde interfaces gráficas hasta en formularios en HTML y son sumamente útiles en la construcción de interfaces y formularios, al igual que cuando creamos nuestra ventana vacía declarándola de la siguiente forma "root = Tkinter.Tk()" tendremos que hacerlo con nuestra etiqueta, para esto necesitamos escoger un nombre en mi caso escogeré "etiqueta" para declararla y deberemos llamar al widget "Label" en vez de la función "Tk" como habíamos hecho anteriormente, como para orientarnos con lo ya visto quedando por ahora algo así: etiqueta = Tkinter.Label()
Una vez creada la estructura básica de la etiqueta, tendremos que llenar esa paréntesis. Primero tendremos que indicar a donde pertenece ese 'label' indicando el identificador de la ventana que en nuestro caso es 'root', separado por una coma escribiremos lo siguiente text= en donde seguido del signo igual incluiremos el texto que deseamos que incluya la etiqueta, la cual puede ser un http://eliluminado.alwaysdata.net/Guia Tkinter
4 / 33
Interfaz gráfica con Tkinter
26/09/2013
texto (que tendremos que encerrar entre comillas al igual que cuando usamos la sentencia print) o una variable que contenga al texto. Para verlo un poco mas claro juntemos todo en dos ejemplos, uno donde muestre un texto fijo que le indiquemos a la etiqueta y otro usando una variable
Ejemplo numero 1: etiqueta = Tkinter.Label(root, text="Codigo Python")
Ejemplo numero 2: import getpass texto = "Bienvenido %s a Codigo Python" % getpass.getuser() etiqueta_2 = Tkinter.Label(root, text=texto)
Expliquemos los dos ejemplos, en el primero usamos un texto fijo no dinámico para utilizar como valor de la etiqueta en cambio en el segundo estamos usando una variable en donde su valor varia dependiendo de la salida que obtengamos al ejecutar 'getpass.getuser()' que obtiene el nombre de usuario que tengamos en nuestra PC, como podemos observar su funcionamiento no varia mucho de lo que nos tiene acostumbrados Python, así que manejarnos con Tkinter es solamente aprendernos un par de nombres de sus widgets como para poder empezar a utilizarlo, el resto sigue siendo código Python. Pero (siempre hay un pero) antes de poder ejecutar este ejemplo en nuestra consola tendremos que declarar este widget en nuestra ventana dándole una ubicación en la misma, sino hacemos esto nuestra etiqueta simplemente no aparecerá en nuestra ventana. Para hacerlo tenemos tres formas (Esto se vera mas detenidamente mas adelante) una es usando 'pack' y las otras dos son 'grid' y 'place'. Como esto se vera mas adelante haré una breve síntesis de las tres opciones que tenemos: 'pack': 'grid': 'place: Como en este ejemplo solo colocaremos una etiqueta no es necesario recurrir al uso de 'grid' para posicionarlo, así que usaremos 'pack' en su lugar. Pero lo mas importante es saber como se declara esta etiqueta en nuestra ventana y poder ver nuestro primer widget en funcionamiento, para lograr esto deberemos usar la siguiente forma: etiqueta.pack()
Como vemos es muy simple solo debemos usar el nombre que utilizamos para declarar nuestra etiqueta seguida de la forma que vayamos a utilizar para posicionarla, pero para los que no desean esperar a leer la siguiente sección para ver como se utiliza 'grid' les dejo la misma etiqueta pero posicionándola con 'grid' en lugar de usar 'pack' como ya lo habíamos visto: etiqueta.grid(row=1, column=1)
Como se puede observar esta otra forma debimos indicarle dos parámetros que sirven para especificar la po sición del widget, en este caso nuestra etiqueta. El primer parámetro es 'row' que se traduce como fila al español y el segundo es 'column' o columna en español con ellos podemos indicar en que columna y fila deberá colocarse el widget, aunque por ahora no profundizaremos entrando en detalles en la forma que trabaja cada uno ni todos los parámetros que acepta cada una. Si ahora escribiéramos todo lo que vimos en nuestra consola tendríamos que ver nuestra primera etiqueta en funcionamiento, contenido dentro de una ventana quedando todo el código como el siguiente: >>> >>> >>> >>> >>>
import Tkinter root = Tkinter.Tk() etiqueta = Tkinter.Label(root, text="Codigo Python") etiqueta.pack() root.mainloop()
Y así es como quedara nuestro ejemplo terminado: Habiendo ya escrito esas lineas se da por finalizada la muestra de este primer widget y podemos seguir con el próximo.
4.2. Botones [Button] Los botones pueden contener texto o imágenes y se les puede asociar funciones o métodos, que al hacer clic sobre ellos Tkinter se encargara de llamar automáticamente a ese método o función y ejecutara el código Python contenido dentro de ellos. Un detalle es que solo puede utilizarse un tipo de fuente, pero ese texto puede ocupar varias lineas en caso de ser necesario. Además se puede subrayar el texto, un carácter o letra en particular, algo que es muy común cuando se desea decirle al usuario sobre la existencia de un atajo con el teclado. Antes de crear a ese botón debemos declarar la función a la cual se llamara, porque como se imaginaran no podemos decirle al botón que ejecute una función que no existe, por eso vamos a escribir un par de lineas y crearemos una función simple como para verificar que dicho botón funciona correctamente. def función():
http://eliluminado.alwaysdata.net/Guia Tkinter
5 / 33
Interfaz gráfica con Tkinter
26/09/2013
print "Excelente"
Con esas dos lineas nos va a servir para demostrar su funcionamiento, ahora si vamos por el botón. A continuación les muestro el código con el cual vamos a trabajar: import Tkinter def funcion(): print "Excelente" root = Tkinter.Tk() boton = Tkinter.Button(root, text="Que te parece la guía?", command=funcion) boton.pack() root.mainloop()
En el se observa la ya conocida importación del modulo Tkinter, la función que ya habíamos declarado y la creación del botón. Como se puede ver la creación de un botón básico es muy similar al de una etiqueta pero se incluye un parámetro mas que nos dará la posibilidad de especificar dentro de el la función que utilizaremos; el parámetro mencionado es 'command' y en el podemos llamar a funciones o métodos, en este caso llamamos a la función 'función' que va a imprimir en la consola la palabra 'Excelente' .
4.3. Cuadro de texto [Entry] Este widget nos permite tanto mostrarle información al usuario como tambi én obtenerla de su parte, dotando a nuestra ventana de un widget muy poderoso y útil, siendo el primero de los widgets mencionados que nos posibilitara la interacción del usuario solicitando la entrada de datos. Como venimos haciendo en esta guía se mostraran algunos conceptos básicos que te permitirán empezar a utilizarlo, pero luego en la sección 'Opciones' se detallan las opciones que tienen disponibles al crear un cuadro de texto. Este elemento es muy popular y sumamente útil así que deberemos de conocerlo y manejarlo, para esto comencemos explicando algunos conceptos básicos para entender mejor de se trata esto. Para empezar a utilizar nuestro elemento 'Entry' podemos primero declarar una variable del tipo 'StringVar' o del tipo 'IntVar' (tenemos mas opciones disponibles pero se verán mas detenidamente en otra sección), estas variables capturan el texto que el usuario ingrese en el cuadro para luego poder trabajar con esos datos, aunque esta practica es muy recomendada y hasta imprescindible en ocasiones, no es un requisito obligatorio para utilizar nuestro cuadro de texto como es visto en algunos sitios web. Por esto veremos primero un uso mas básico para luego entrar mas en detalle e incorporar estas variables a nuestro repertorio. La forma en que se declara un cuadro de texto es muy simple: campo_de_texto = Tkinter.Entry(root) Esa es su forma mas básica en donde como se observa no se llama a ninguna de las opciones que tenemos disponibles, antes de ver los métodos que podemos llamar para hacer uso de este widget veamos un ejemplo de su uso >>> >>> >>> >>> >>> '' >>>
import Tkinter root = Tkinter.Tk() campo_de_texto = Tkinter.Entry(root) campo_de_texto.pack() campo_de_texto.get()
Si escribiéramos un texto en el cuadro y escribimos en la consola lo siguiente campo_de_texto.get()
estaríamos usando el método 'get' del widget Entry que nos permite obtener el texto que contenga el cuadro de texto, como podemos observar en el siguiente ejemplo >>> import Tkinter >>> root = Tkinter.Tk() >>> campo_de_texto = Tkinter.Entry(root) >>> campo_de_texto.pack() >>> # En este caso escribi "CodigoPython.com.ar" >>> campo_de_texto.get() 'CodigoPython.com.ar' >>>
Seguramente ese rectángulo en nuestra ventana de poco serviría si no pudiésemos interactuar con este. A continuación veremos los métodos a lo podemos llamar para trabajar con este widget. Una observación que se debe hacer, es que para escribir varias lineas de texto se debe utilizar el widget 'Text' que esta pensado http://eliluminado.alwaysdata.net/Guia Tkinter
6 / 33
Interfaz gráfica con Tkinter
26/09/2013
para esto, que sera visto mas adelante.
4.3.1. Índices Un concepto que hay que tener en cuenta antes de empezar a utilizar algunos métodos disponibles para 'Entry' son los índices, estos nos facilitan el insertado y eliminado de caracteres entre otras cosas, estableciendo desde y hasta donde deseamos por ejemplo borrar o insertar texto en el cuadro de texto. Para conseguir esto contamos con varias formas que las iremos viendo de a una para luego verlas dentro de los métodos que las soportan y ya con unos ejemplos para afianzar los conocimientos. Índices numéricos Estos funcionan como los índices de las listas de Python así que su aplicación no debería ser complicada, el primer carácter comenzara a contar desde 0 en adelante. Para mas referencia repase los conceptos básicos de listas y tuplas en Python. ANCHOR Este índice corresponde al inicio del texto que se encuentre seleccionado, en caso de existir un texto seleccionado. Se puede usar select_from y select_adjust para alterar el comportamiento del mismo. END También podemos marcar desde un determinado carácter hasta el ultimo sin conocer la cantidad de caracteres que componen a ese campo de texto, esto es gracias a 'END' que haría de comodín para manejarnos de una forma mas sencilla. El uso de los índices (0, END) equivaldría a seleccionar todo el texto disponible. INSERT Este índice corresponde a la posición actual de donde se encuentra el cursor. Este índice se puede trabajar junto con el método 'icursor' para alterar el lugar del cursor. Obviamente cuando nos referimos a cursor nos referimos a la barra vertical que nos aparece cuando escribimos no al cursor del mouse (Ver mas i nformación aquí Cursor de texto). sel.first y sel.last Así como vimos opciones para trabajar con índices sobre el texto del cuadro, tenemos dos índices mas específicos que nos permiten trabajar únicamente con el texto que se encuentre seleccionado. Con sel.first indicamos que deseamos trabajar con el primer carácter del texto que se encuentre seleccionado y con sel.last indicamos que deseamos trabajar con el ultimo carácter de la selección. Coordenadas del Mouse Otras de la posibilidades disponibles es usar la posición del cursor del mouse para indicar el índice. La forma en que trabaja es a través de la siguiente sintaxis @x Donde 'x' es un valor en píxeles con respecto al borde izquierdo del campo de texto. Por ejemplo '@0' indica el carácter mas a la izquierda del campo del texto. Estos índices nos permiten tener un mayor control sobre sobre los cuadros de texto y lo veremos mas claro en la sección siguiente cuando veamos los métodos disponibles para este. NOTA: Una observación que se puede hacer sobre los índices es que pueden usarse abreviaturas de los nombres, po r ejemplo en vez de usar 'end' se puede utilizar 'e'. Como opinión personal no recomiendo el uso de esta practica ya que puede quitar legibilidad al código y generar malas costumbres.
4.3.2. Métodos Como habíamos comentando cuando estábamos viendo el widget Entry, dijimos que existían métodos que nos permitían trabajar con este, los cuales iremos viendo a continuación. bbox cget(OPCION) Este metodo nos permite obtener el valor de determinada opcion pasada al campo de texto, supongamos que deseamos obtener el color de fondo (background) del campo o el tipo de borde (relief) que tiene, para esto contamos con 'cget' el cual pasandole como una cadena el nombre de la opci on nos devuelve su valor. Por ejemplo si sobre nuestro campo de texto llamaramos al metodo 'cget' con los siguientes argumentos veriamos algo asi: >>> campo_de_texto.cget('background') 'SystemWindow' >>> campo_de_texto.cget('relief')
http://eliluminado.alwaysdata.net/Guia Tkinter
7 / 33
Interfaz gráfica con Tkinter
26/09/2013
'sunken'
Asi funcionaria de la misma forma para todas las opciones soportadas por el widget. configure delete(INICIO, FIN) Elimina uno o mas elementos del campo de texto, este método recibe dos argumentos uno es el inicio desde donde se desea eliminar el contenido y el segundo argumento es hasta donde deseamos eliminar, al igual que en Python debemos comenzar el índice contando desde 0. Por ejemplo para eliminar de la siguiente cadena '0123456789' de los caracteres del 0 al 5, los índices que le deberíamos de dar serian (0, 6). Esto no es nada nuevo a lo ya venimos viendo en este lenguaje de programación. También podemos pasarle un solo argumento para borrar un solo carácter, veamos estos dos a través de unos ejemplos. Con un solo argumento: >>> import Tkinter >>> root = Tkinter.Tk() >>> campo_de_texto = Tkinter.Entry(root) >>> campo_de_texto.pack() >>> campo_de_texto.get() 'CodigoPython.com.ar' >>> campo_de_texto.delete(0) >>> campo_de_texto.get() 'odigoPython.com.ar' >>>
Con dos argumentos: >>> import Tkinter >>> root = Tkinter.Tk() >>> campo_de_texto = Tkinter.Entry(root) >>> campo_de_texto.pack() >>> campo_de_texto.get() 'CodigoPython.com.ar' >>> campo_de_texto.delete(12, 19) >>> campo_de_texto.get() 'CodigoPython' >>>
Otra opción que tenemos es borrar desde un inicio fijado por nosotros hasta el final del texto disponible en el campo de texto gracias a un índice que nos da Tkinter que es 'END', con este podemos de la siguiente forma borrar desde el inicio hasta el final sin necesitar conocer cuantos caracteres componen el texto contenido en el widget campo_de_texto.delete(0, Tkinter.END)
Aunque no es necesario comenzar desde el inicio también podemos borrar desde el quinto carácter hasta el ultimo campo_de_texto.delete(5, Tkinter.END)
También podemos utilizar los índices ya vistos en la sección 'Índices'. get() Obtiene el contenido del campo de texto. Algo muy necesario para nosotros es poder obtener el texto contenido dentro del campo de texto, para conseguir esto podemos hacernos del método 'get' que nos lo permitirá, este nos retornara el texto como una cadena. Veamos con un ejemplo escribiendo cualquier texto y llamamos al método 'get' >>> >>> >>> >>> >>> >>> >>> 'No >>>
import Tkinter root = Tkinter.Tk() campo_de_texto = Tkinter.Entry(root) campo_de_texto.pack() # Ahora deben escribir el texto # en el campo de texto campo_de_texto.get() se olviden de visitar http://www.codigopython.com.ar/'
El valor que nos retorne siempre sera como una cadena y es muy simple comprobarlo, coloquemos un texto en nuestro campo http://eliluminado.alwaysdata.net/Guia Tkinter
8 / 33
Interfaz gráfica con Tkinter
26/09/2013
de texto, en mi caso escribiré la cadena 'Aguante Python' y almacenemos su valor en una variable para luego analizarla con la función 'type' de Python >>> var = campo_de_texto.get() >>> var 'Aguante Python' >>> type(var)
>>>
Si lo hacemos usando solo números en el campo de texto obtendremos el mismo resultado >>> var = campo_de_texto.get() >>> var '0123456789' >>> type(var) >>>
Mas adelante veremos como validar nuestros campos de textos. icursor(INDICE) Nos permite mover el cursor hasta la posición indicada, cuando vimos acerca de los índices vimos a INSERT y mencionamos a 'icursor'. Este método nos permite cambiar a donde deseamos que cambie la posición del cursor y junto a INSERT podemos llevar nuestra aplicación a otro nivel de interacción con el usuario. Un ejemplo simple seria el siguiente >>> entrada.icursor(0) >>> entrada.icursor(END)
Recuerden de haber escrito un texto en el campo y que tenemos a nuestra disposición los índices para indicar la posición del cursor. index(INDICE) Indica el valor numerico del indice indicado. La utilidad de 'index' esta en que nos permite saber por ejemplo cual es el indice del ultimo caracter, ya vimos que con END podiamos ir al ultimo caracter del cuadro de texto, pero como saber cuantos caracteres tiene esa cadena sin recurir a 'len()', ahi entra 'index' que nos permite obtener esos valores. Aclaremos estos conceptos con unos sencillos ejemplos. >>> campo_de_texto.get() 'ABCD' >>> campo_de_texto.index("end") 4 >>>
Ahora probemos poniendo el cursor despues del tercer caracter y veamos si podemos obtener su posicion >>> campo_de_texto.index("insert") 3 >>>
Asi como funciono con 'end' y 'insert' tambien deberia hacerlo con 'anchor', asi que volvamos a la consola. Para el primer ejemplo seleccionemos desde el indice 4 al 0, es decir seleccionemos todo el texto de derecha hacia izquierda >>> campo_de_texto.index("anchor") 4 >>>
Y ahora hagamos algo similar pero seleccionando de izquierda hacia derecha >>> campo_de_texto.index("anchor") 0 >>>
Como vemos pasandole el indice 'anchor' podemos obtener el indice numerico desde donde se inicio la seleccion del texto. Y como ultimo ejemplo como resultaria logico si le pasamos como argumento un indice numerico nos deberia devolver ese mismo numero >>> campo_de_texto.index(3) 3 http://eliluminado.alwaysdata.net/Guia Tkinter
9 / 33
Interfaz gráfica con Tkinter
26/09/2013
>>>
Salvo que le indiquemos un numero mayor a la cantidad de caracteres disponibles, que en ese caso nos devolvera el valor del ultimo indice >>> campo_de_texto.index(9) 4 >>>
insert(INDICE, CADENA) Permite la inserción de texto. Supongamos que necesitamos insertar una cadena, un numero o un carácter en un campo de texto, para conseguirlo es tan simple como llamar a este método pasándole dos argumentos como parámetros. De los dos argumentos mencionados uno es el índice de donde deseamos insertar el texto y el segundo es la cadena o caracter. En este ejemplo insertaremos la cadena "GNU/" desde el índice 0 >>> import Tkinter >>> root = Tkinter.Tk() >>> campo_de_texto = Tkinter.Entry(root) >>> campo_de_texto.pack() >>> campo_de_texto.get() >>> campo_de_texto.insert(0, "GNU/") >>> campo_de_texto.get() 'GNU/Linux' >>>
scan selection validate xview Este comando se utiliza para consultar y cambiar la posición horizontal del texto en la ventana del widget. Puede tomar cualquiera de las siguientes formas: Con lo que vimos ahora estamos mas cerca de dominar los cuadros de texto, aunque no hay que apresurarnos que nos queda mucho camino por delante.
4.3.3. Validando un campo de texto Para referencias acerca de textvariable vea la sección "Variables".
4.4. Casillas de verificacion [Checkbutton] Los que tengan conocimiento en interfaces o diseño web seguramente conoceran a los famosos 'checkbox' que en Tkinter tienen el nombre de 'checkbutton', para los nos los conocen se tratan de casillas de verificacion cuya funcion es la de permitir seleccionar o deseleccionar, activando o desactivando funciones u opciones. A quien no le a tocado activar ese pequeño cuadrado al lado de un texto que nos dice "He leído y acepto los términos y condiciones del sitio.", aunque haya aplicaciones que puedan no requerirlo no significa que se pueda prescindir de ellos ya que su uso esta en gran parte de las aplicaciones de uso cotidiano desde nuestros editores o entornos de desarrollo cuando programamos hasta en las utilidades de configuracion de nuestros sistemas operativos, aunque repetimos su uso nos es obligatorio siempre es bueno conocer las herramientas que tenemos disponibles. Como venimos haciendo escribamos un poco de codigo y luego vayamos viendo que se escribio >>> >>> >>> >>> 0 >>> >>> >>> >>> 1 >>> >>> 0 >>>
import Tkinter root = Tkinter.Tk() int_var = Tkinter.IntVar() int_var.get() check = Tkinter.Checkbutton(root, text="Probando", variable=int_var) check.pack() #Hacemos click en el checkbutton activandola int_var.get() #Ahora desmarcamos la opcion del checkbutton int_var.get()
http://eliluminado.alwaysdata.net/Guia Tkinter
10 / 33
Interfaz gráfica con Tkinter
26/09/2013
>>> import Tkinter >>> root = Tkinter.Tk() >>> bool_var = Tkinter.BooleanVar() >>> bool_var.get() 0 >>> check = Tkinter.Checkbutton(root, text="Probando", variable=bool_var) >>> check.pack() >>> bool_var.get() True >>> bool_var.get() False >>>
Checkbutton Basico en Tkinter por eliluminado2010 En los dos ejemplos establecemos una variable que puede ser del tipo 'IntVar' o 'BooleanVar', las dos cumplen con su trabajo aunque trabajen con distintos tipos de datos consiguen el mismo resultado, establecida nuestra variable pasamos a crear y mostrar nuestra casilla de verificacion y con ella marcandola y desmarcandola vemos como el valor de la variable alterna de True a False e n el caso de 'BooleanVar' o de 0 a 1 en el caso de'IntVar'. Con este ejemplo podemos tener una idea de como trajaba 'Checkbutton' pero aun nos quedan ver algunos metodos para volverlo mas interesante.
4.4.1. Métodos cget(OPCION) Este metodo cumple la misma funcion que se vio en el widget 'Entry'. configure Este metodo cumple la misma funcion que se vio en el widget 'Entry'. deselect Desmarca la selección de la casilla de verificacion y establece el valor de la variable asociada a False. Usarlo es muy simple, para verlo deberiamos crear un 'Checkbutton' basico marcarlo y luego llamar al metodo 'deselect' >>> checkbutton.deselect()
flash invoke select Asi como contamos con una forma de desmarcar nuestro 'Checkbutton' con 'select' podemos marcarla. >>> checkbutton.select()
toggle Este ultimo metodo une a 'select' y 'deselect', nos permite alternar su estado actualizando el valor de su variable asoci ada, por ejemplo si la casilla se encontrara marcada al llamar a 'toggle' esta se desmarcaria y si volvieramos a llamar a 'toggle' esta se volveria a marcar. == Barras de desplazamiento [Scrollbar] ==
4.5. Campo de texto multilinea [Text] 4.6. Opciones Muchos de los widgets que utilizamos y vimos hasta ahora cuentan con opciones, con el fin de no repetir la descripcion de cada uno http://eliluminado.alwaysdata.net/Guia Tkinter
11 / 33
Interfaz gráfica con Tkinter
26/09/2013
de ellos seran vistos uno a uno en esta seccion. NOTA: Para mas informacion sobre los colores visite la seccion "Colores" que se ve en "Gestion del diseño" Pueden encontrar mas informacion desde la documentacion oficial de Tcl/Tk sobre las opciones estandar http://www.tcl.tk/man/tcl8.5/TkCmd/options.htm
4.6.1. activebackground Con esta opcion podemos indicar que color de fondo se debera utilizar cuando el cursor del mouse se posicione sobre el widget, Para algunos elementos y en algunas plataformas solo sera visible cuando se hace click sobre el. boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, activebackground="#F50743")
4.6.2. activeborderwidth 4.6.3. activeforeground Al igual que pasa con 'activebackground' con esta otra opcion podemos especificar el color en este caso de la fuente del widget cuando se posiciona el cursor sobre este. boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, activeforeground="#F50743")
4.6.4. anchor Tkinter nos permite controlar de que forma se va a posicionar un texto o imagen con respecto al widget en el que se encuentra. La opcion por defecto es 'CENTER' que muestra el elemento centrado. NW N NE W CENTER E SW S SE Posiciona el texto/imagen en la esquina superior izquierda del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="nw")
Posiciona el texto/imagen en la parte superior del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="n")
Posiciona el texto/imagen en la esquina superior derecha del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="ne")
Posiciona el texto/imagen en la parte izquierda del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="w")
Posiciona el texto/imagen en el centro del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="center")
Posiciona el texto/imagen en la parte derecha del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="e")
Posiciona el texto/imagen en la esquina inferior izquierda del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="sw")
http://eliluminado.alwaysdata.net/Guia Tkinter
12 / 33
Interfaz gráfica con Tkinter
26/09/2013
Posiciona el texto/imagen en la parte inferior del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="s")
Posiciona el texto/imagen en la esquina inferior derecha del widget boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, width=20, height=10, anchor="se")
4.6.5. background (bg) Sirve para indicar el color de fondo que tendra en area del widget cuando este se encuentre inactivo. Tambien se puede utilizar su forma abreviada 'bg' como podemos ver en el segundo ejemplo. boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, background="#38EB5C") boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, bg="#38EB5C")
4.6.6. bitmap 4.6.7. borderwidth (bd) Nos da la posibilidad de especificar el ancho del borde del elemento con el que estemos trabajando, Tkinter nos permite especificar el valor en varias unidades de medida (centimetros, pulgadas, milimetros y puntos) las cuales seran vistas mas adelante en la guia. Si no se utiliza junto con la opcion 'relief' visualmente es similar a utilizar las opciones 'heigth' y 'width' como se puede observar en el ejemplo. El valor por defecto es de 2 pixeles. etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", borderwidth=15) etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", bd=15)
4.6.8. command Como ya lo mencionamos cuando vimos al widget Button este permite indicar la funcion o metodo que queremos que se llame cuando se preciona por ejemplo un boton, pero esta opci on tambien funciona con otros widgets de Tkinter cumpliendo la misma funcion. def funcion(): print "Excelente" boton = Tkinter.Button(root, text="Que te parece la guia?", command=funcion)
4.6.9. cursor Nos da la posiblidad de indicar que cursor queremos que se muestre cuando el mouse se posiciona sobre la etiqueta. En el siguiente enlace podremos encontrar una lista con los cursores disponibles en Tkinter http://www.tcl.tk/man/tcl8.5/TkCmd/cursors.htm (Ver seccion "Anexos" para ver el listado completo). El valor 'none' consigue eliminar el cursor cuando se pasa el cursor sobre el widget. etiqueta = Tkinter.Label(root, text="Que te parece la guia?", cursor="hand1")
4.6.10. compound Especifica si el widget debe mostrar texto y mapas/imágenes al mismo tiempo, y si es así, donde el mapa de bits o imagen debe estar en relación con el texto. Debe ser uno de los valores "none", "bottom", "top", "left", "right", o "center". Por ejemplo, el valor (predeterminado) "none" especifica que el mapa de bits o imagen (si se ha definido en el sistema) se mostrará en lugar del texto, el valor "left" especifica que el mapa de bits o imagen se muestra a la izquierda del texto y el valor "center" especifica que el mapa de bits o imagen debe aparecer en la parte superior del texto.
4.6.11. default
http://eliluminado.alwaysdata.net/Guia Tkinter
13 / 33
Interfaz gráfica con Tkinter
26/09/2013
4.6.12. disabledbackground 4.6.13. disabledforeground 4.6.14. exportselection 4.6.15. font 4.6.16. foreground (fg) Si deseamos cambiar el color de las letras de nuestro texto cuando el widget se encuentra inactivo tendremos que utilizar esta opcion, que trabaja de forma similar al ya visto 'background'. En este se tambien se puede utilizar su abreviatura 'fg' como podemos ver en el segundo ejemplo boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, foreground="#38EB5C") boton = Tkinter.Button(root, text="Hola Mundo!!!", command=funcion, fg="#38EB5C")
4.6.17. height Permite indicar la altura a la que se posicionara nuestro widget en lineas no en pixeles. Si esta opcion no se especifica el tamaño del elemento se ajustara dependiendo el contenido del mismo etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", height=10)
4.6.18. highlightbackground 4.6.19. highlightcolor 4.6.20. highlightthickness 4.6.21. image 4.6.22. indicatoron 4.6.23. insertbackground 4.6.24. insertborderwidth 4.6.25. insertofftime 4.6.26. insertontime 4.6.27. insertwidth 4.6.28. jump 4.6.29. justify RIGHT
http://eliluminado.alwaysdata.net/Guia Tkinter
14 / 33
Interfaz gráfica con Tkinter
26/09/2013
etiqueta = Tkinter.Label(root, text="Hola\n Mundo!!!", justify="right")
CENTER etiqueta = Tkinter.Label(root, text="Hola\n Mundo!!!", justify="center")
LEFT etiqueta = Tkinter.Label(root, text="Hola\n Mundo!!!", justify="left")
4.6.30. offrelief 4.6.31. offvalue 4.6.32. onvalue 4.6.33. orient 4.6.34. overrelief Specifies an alternative relief for the button, to be used when the mouse cursor is over the widget. This option can be used to make toolbar buttons, by configuring -relief flat -overrelief raised. If the value of this option is the empty string, then no alternative relief is used when the mouse cursor is over the button. The empty string is the default value. Especifica un relieve alternativo para el botón, que se utilizará cuando el cursor del ratón sobre el widget. Esta opción se puede utilizar para hacer botones de la barra de herramientas, mediante la configuración de alivio-overrelief plana elevada. Si el valor de esta opción es la cadena vacía, entonces no hay alivio alternativa se utiliza cuando el cursor del ratón sobre el botón. La ca dena vacía es el valor predeterminado. Type "help", "copyright", "credits" or "license" for more information. >>> import Tkinter >>> root = Tkinter.Tk() >>> button = Tkinter.Button(root, text="overrelief", overrelief="") >>> button.pack() >>> button2 = Tkinter.Button(root, text="overrelief flat", overrelief="flat") >>> button2.pack() >>> button3 = Tkinter.Button(root, text="overrelief raised", overrelief="raised") >>> button3.pack() >>>
4.6.35. padx 4.6.36. pady 4.6.37. relief Especifica la apariencia de un borde decorativo alrededor del widget que simula un efecto 3D sobre el elemento, el ancho de esta sombra depende del valor que se especifique con el atributo 'borderwidth', los posibles valores son SUNKEN, RAISED, GROOVE, RIDGE, FLAT. El valor por defecto es FLAT que no coloca ningun borde sobre el widget. Descripcion de los cuatro estilos: SUNKEN: Borde hundido, que provoca que el elemento que encierra parezca que se encuentra por debajo del nivel de la superficie de la pantalla. RAISED: Borde saliente, que provoca que el elemento que encierra parezca que se encuentra por encima del nivel de la superficie de la pantalla. GROOVE: Borde hundido, que visualmente parece que se encuentra por debajo del nivel de la superficie de la pantalla. RIDGE: Borde saliente, que visualmente parece que se encuentra por encima del nivel de la superficie de la pantalla. FLAT: No se muestra ningún borde. E em los: http://eliluminado.alwaysdata.net/Guia Tkinter
15 / 33
Interfaz gráfica con Tkinter
26/09/2013
SUNKEN etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", relief="sunken", borderwidth=5)
RAISED etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", relief="raised", borderwidth=5)
GROOVE etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", relief="groove", borderwidth=5)
RIDGE etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", relief="ridge", borderwidth=5)
FLAT etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", relief="flat", borderwidth=5)
4.6.38. repeatdelay 4.6.39. repeatinterval 4.6.40. selectbackground 4.6.41. selectborderwidth 4.6.42. selectcolor 4.6.43. selectforeground 4.6.44. selectimage 4.6.45. setgrid 4.6.46. state Esta opcion especifica tres estados 'normal', 'active' o 'disabled'. En estado normal se muestra el widget usando las opciones 'foreground' y 'background', en estado 'active' se muestra usando las opciones 'activeforeground' y 'activebackground' y por ultimo el estado 'disabled' es mostrado usando 'disabledforeground' y 'background'. En el siguiente ejemplo se definen tres etiquetas, las tres tienen los mismos argumentos con lo mismos valores a excepcion de la opcion 'state', en el resultado final podremos ver que al cambiar el valor de 'state' solo toma los valores que habiamos mencionado en la descipcion de la opcion ignorando el resto. >>> >>> >>> >>> >>> >>> >>> >>> >>> ... ... ... ... ...
import Tkinter root = Tkinter.Tk() foreground = "red" background = "blue" activeforeground = "green" activebackground = "black" disabledforeground = "white" label1 = Tkinter.Label(root, text="normal", state="normal", foreground=foreground, background=background, activeforeground=activeforeground,
http://eliluminado.alwaysdata.net/Guia Tkinter
16 / 33
Interfaz gráfica con Tkinter
... ... ... >>> >>> ... ... ... ... ... ... ... ... >>> >>> ... ... ... ... ... ... ... ... >>> >>> >>> >>>
26/09/2013
activebackground=activebackground, disabledforeground=disabledforeground ) label2 = Tkinter.Label(root, text="active", state="active", foreground=foreground, background=background, activeforeground=activeforeground, activebackground=activebackground, disabledforeground=disabledforeground ) label3 = Tkinter.Label(root, text="disabled", state="disabled", foreground=foreground, background=background, activeforeground=activeforeground, activebackground=activebackground, disabledforeground=disabledforeground ) label1.pack() label2.pack() label3.pack()
4.6.47. takefocus 4.6.48. text Este es un elemento muy importante para los widgets como Label o Button entre otros, esta opcion nos da la posibilidad de incluir un texto dentro del widget, este texto puede contener saltos de lineas en caso de ser necesario y tambien se puede utilizar una variable para indicar la cadena de texto a usar. Si se utiliza una imagen este elemento es ignorado por Tkinter. Ejemplo simple: etiqueta = Tkinter.Label(root, text="Codigo Python")
Ejemplo con una variable: texto = "Codigo Python" etiqueta = Tkinter.Label(root, text=texto)
Ejemplo con salto de linea (recuerden que deben usar el caracter \n para el salto de linea): etiqueta = Tkinter.Label(root, text="Hola \n a todos")
Ejemplo con tabulacion (recuerden que deben usar el carac ter \t para la tabulacion): etiqueta = Tkinter.Label(root, text="Hola \t a todos")
4.6.49. textvariable Especifica el nombre de una variable global. El valor de la variable es una cadena de texto que se mostrará en el interior el widget, y si el valor de la variable cambia, el widget se actualizará automáticamente para reflejar el nuevo valor. La forma en que se muestra la cadena en el widget depende del widget en particular y puede ser determinada por otras opciones, tales como anclaje o justificar. Se puede ver mas detalladamente en la seccion "Variables"
4.6.50. tristateimage 4.6.51. tristatevalue 4.6.52. troughcolor
http://eliluminado.alwaysdata.net/Guia Tkinter
17 / 33
Interfaz gráfica con Tkinter
26/09/2013
4.6.53. underline Permite subrayar una letra de nuestra etiqueta, algo que es muy util para por ejemplo destacar un atajo con el teclado. La forma en que se utiliza es indicandole el indice de la cadena de texto que conforma nuestra etiqueta comenzando desde cero. El valor por defecto de esta opcion es -1 lo que logra que no se subraye ninguna letra Ejemplo con una etiqueta etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", underline=3)
Ejemplo con un boton boton = Tkinter.Button(root, text="Imprimir Hola Mundo!!!", command=funcion, underline=3)
4.6.54. variable 4.6.55. width Esta opcion nos permite indicar en ancho del elemento con el que estamos trabajando midiendolo en caracteres no en pixeles si se trata de texto, si en cambio estamos trabajando con imagenes si deberemos medirlo en pixeles, si se le da un valor negativo este servira para indicar el ancho minimo del widget. Si esta opcion no se especifica el tamaño del elemento se ajustara dependiendo el contenido del mismo. etiqueta = Tkinter.Label(root, text="Hola Mundo!!!", width=30)
4.6.56. wraplength Para los widgets que pueden realizar ajuste de líneas, esta opción especifica la longitud máxima de la línea. Las líneas que exceden este tamaño saltan a la siguiente línea, de forma que ninguna línea es más larga que la longitud especi ficada. El valor puede especificarse en cualquiera de las medidas normalizados para distancias de pantalla. Si este valor es menor que o igual a 0, entonces no se realiza envoltura: líneas se romperán sólo en caracteres de nueva línea en el texto.
4.6.57. xscrollcommand 4.6.58. yscrollcommand 4.6.59. Disponibles para
4.7. Variables Acá es donde se muestra una de las opciones que disponemos en varios widgets y es 'textvariable' que tomara como valor la variable del tipo StringVar que habíamos mencionado en 'Entry', esta nos permitirá trabajar con varios métodos en Entry que se los iré mostrando y los iremos viendo con ejemplos. Cabe aclararse que el uso de estas variables no se limitan solamente a la opcion 'textvariable' como lo podremos iremos viendo en otros ejemplos mas adelante. Tengan en cuenta que StringVar no forma parte de Python sino de Tkinter así que la importación de este es fundamental para poder utilizarlo, aunque para algunos resulte una obviedad nunca esta de mas remarcarlo ya que si utilizamos la forma 'from Tkinter import *' estos detalles no se observan y pueden generar confusión cuando se ven los ejemplos. Como habíamos mencionado contamos con cuatro clases de variables con Tkinter las cuales son BooleanVar, DoubleVar, IntVar y StringVar, esta ultima suele ser la mas vista y utilizada en los tutoriales disponibles en internet pero no por esto mas importante que las demás. Para comenzar a utilizarlo veamoslo con un ejemplo simple, supongamos que tenemos un cuadro de texto y queremos almacenar e l texto ingresado en una variable, el problema con usar el metodo 'get' del widget 'Entry' es que, lo que se almacenaria seria el valor que contiene el cuadro al momento de llamar al metodo lo cual es util, pero hay veces que queremos las modificaciones que se puedan ir realizando a dicho texto. En estos casos es donde se nos brindan herramientas como estas variables donde las modificaciones que se hacen en el cuadro de texto se ven reflejadas en la variable, mas adelante se vera que nos estan limitada s a cuadros de texto sino que contaremos con otros widgets que pueden hacer uso de estas. Un ejemplo sensillo para verlo en accion: >>> #Primero creamos nuestra ventana vacia
http://eliluminado.alwaysdata.net/Guia Tkinter
18 / 33
Interfaz gráfica con Tkinter
26/09/2013
>>> import Tkinter >>> root = Tkinter.Tk() >>> #Definimos nuestra variable del tipo "StringVar" >>> variable = Tkinter.StringVar() >>> variable >>> #Creamos nuestro campo de texto pasandole nuestra variable >>> campo_de_texto = Tkinter.Entry(root, textvariable=variable) >>> campo_de_texto.pack() >>> #Insertamos un poco de texto >>> campo_de_texto.insert(0, "Probando") >>> #Aca llamamos al metodo 'get' de 'Entry' >>> campo_de_texto.get() 'Probando' >>>#y aca al metodo 'get' pero de nuestra variable para obtener su valor >>> variable.get() 'Probando' >>> #Y para repetir su funcionamiento agregamos unpoco mas de texto >>> campo_de_texto.insert('end', " como funciona") >>> campo_de_texto.get() 'Probando como funciona' >>> variable.get() 'Probando como funciona' >>>
NOTA: Si desean ver como funcionan mas en detalle estas variables pueden ver estos objetos desde el codigo fuente de la libreria Tkinter, para esto deben dirigirse a la carpeta donde se encuentra instalado python y ahi van a la carpeta 'Lib' y luego a la carpeta 'lib-tk', alli se encuentra el codigo fuente de Tkinter, la clase que contieneal objeto 'StringVar' se encuentra dentro del archivo 'Tkinter.py' que es el que se carga cuando hacemos 'import Tkinter' Pudimos notar en ese ejemplo el uso de un metodo llamado 'get' el cual esta disponible para las cuatro tipos de variables, al igual que otros metodos que iremos viendo de a uno. Empecemos viendo esa linea donde creamos esa variable llamada 'variable', donde a 'StringVar' no le pasamos ningun argumento, si se dieron una vuelta por el codigo fuente de Tkinter.py habran visto cuando se inicializa el objeto se ve que toma 3 parametros con valores 'None', analicemos su funcionamiento master value Nos permite asignar un valor a la variable cuando esta es creada >>> variable = Tkinter.StringVar(value="Hola") >>> variable.get() 'Hola'
name Nos permite darle un nombre opcional, por defecto Tkinter le un nombre del tipo PY_VARnum, donde 'num' es reemplazado por un numero que varia dependiendo de la cantidad de variables que hayan sido creadas. Este valor es usado internamente por el lenguaje Tcl por lo queno nos interesara modificar su valor. Para conocer su valor simplemente llamamos al atributo '_name' que nos mostrara el valor de este. >>> variable = Tkinter.StringVar() >>> variable._name 'PY_VAR0'
Ahora que ya sabemos como y con que crear nuestra variable veamos los metodos que tememos disponibles. get() Aunque ya vimos a 'get' no esta demas mencionarlo nuevamente ya que este seguramente sera el mas utilizado junto a 'set', 'get' nos permite obtener el valor contenido en la variable. >>> variable.get()
set(value) Como se menciono en la descripcion de 'get' estos forman una gran pareja resultando en dos metodos basicos muy utiles, este metodo en particular nos permite modificar el contenido >>> variable.set("Valor que deseamos guardar")
trace_variable(mode, callback) Ya vimos dos metodos sencillos, pero ahora mostraremos tres con un uso un poco mas avanzado pero una vez que entendamos como funcionan nos permitiran conseguir resultados bastantes avanzados. En primer lugar tenemos a 'trace_variable' el cual nos permite definir una funcion a la cual llamar cuando se realice una determinada accion sobre la variable para ello cuenta con dos parametros uno de ellos es 'mode' que nos pide en que modo de captura es que llamara a la funcion, puede tomar tres valores 'w', 'r' y 'u' donde 'w' es para cuando se escribe en la variable, 'r' corresponde a la lectura de la misma y por ultimo 'u'. trace_vdelete Mientras que con 'trace_variable' podiamos definir una funcion para determinados eventos tambien necesitabamos una herramienta que nos permitiera quitar esa respuesta para ese evento y es cuando entra 'trace_vdelete'. Su funcionamiento es es muy simple este toma un modo que ya habiamos visto y ademas nos pide el valor que nos devolvio 'trace_variable' al momento de ser ejecutado, veamoslo con un pequeño ejemplo y luego retomamos su explicacion trace_vinfo http://eliluminado.alwaysdata.net/Guia Tkinter
19 / 33
Interfaz gráfica con Tkinter
26/09/2013
Para finalizar veremos la diferencia entre las cuatro variables disponibles, ya vimos como crear y trabajar con las variables del tipo 'StringVar' pero que paso con el resto. Trabajar con 'StringVar' o con las demas es exactamente igual, las distinguimos por el tipo de valores que manejan, por ejemplo si necesitamos trabajar con cadenas de texto debemos utilizar a 'StringVar' como lo veniamos haciendo, si se trata de numeros enteros utilizaremos a 'IntVar', tambien puede ser el caso de que queremos trabajar con numeros pero con decimales para esto tenemos a 'DoubleVar' y por ultimo esta 'BooleanVar' que maneja los valores booleanos como 'True' y 'False' La siguiente tabla es a modo de resumen: Nombre Tipo de valo r en Python StringVar str IntVar int DoubleVar float BooleanVar bool
5. Gestión del diseño 5.1. Métodos Los siguiente metodos nos daran la posibilidad de personalizar al maximo nuestra aplicacion y cada una de sus ventanas
5.1.1. iconify Descripcion: Permite minimizar la ventana que le indiquemos, esto es util para por ejemplo minimizar una ventana padre cuando se abre una ventana hija. Lo mejor sera verlo con unos ejemplos. Argumentos: No tiene Ejemplos: En este ejemplo usamos el metodo 'iconify' en un boton para minimizar la ventana cuando se haga click sobre el: import Tkinter root = Tkinter.Tk() boton = Tkinter.Button(root, text="Minimizar", command=root.iconify) boton.pack() root.mainloop()
En este otro ejemplo creamos un boton que abre otra ventana y minimiza la ventana padre import Tkinter def funcion(): otra_ventana = Tkinter.Toplevel(root) root.iconify() root = Tkinter.Tk() boton = Tkinter.Button(root, text="Abrir otra ventana", command=funcion) boton.pack() root.mainloop()
5.1.2. deiconify Descripcion: Al contrario de como vimos en 'iconify' que podiamos minimizar la ventana, con 'deiconify' podemos restaurar la ventana, como paso con 'iconify' veamoslo con unos ejemplos Argumentos: No tiene Ejemplos: Esta es una variacion de uno de los ejemplos que ya habiamos visto, pero en este cuando hacemos click en el boton 'Minimizar' este se minimiza pero pasado 5 segundos se vuelve a restaurar la ventana. http://eliluminado.alwaysdata.net/Guia Tkinter
20 / 33
Interfaz gráfica con Tkinter
26/09/2013
import Tkinter import time def
funcion(): root.iconify() time.sleep(5) root.deiconify()
root = Tkinter.Tk() boton = Tkinter.Button(root, text="Minimizar", command=funcion) boton.pack() root.mainloop()
5.1.3. title Descripcion: Permite indicar el titulo de la ventana. Podria decirse que este valor se hereda ya que si creamos una nueva ventana a traves de Toplevel esta tomaria el nombre de la ventana padre. Argumentos: String (Cadena) Ejemplos: Ejemplos simple: root = Tkinter.Tk() root.title("Bienvenido a Codigo Python") root.mainloop()
Heredando el titulo de la ventana padre: root = Tkinter.Tk() root.title("Bienvenido a Codigo Python") otra_ventana = Tkinter.Toplevel(root) root.mainloop()
Ejemplo de dos ventanas con titulos distintos: root = Tkinter.Tk() root.title("Bienvenido a") otra_ventana = Tkinter.Toplevel(root) otra_ventana.title("Codigo Python") root.mainloop()
5.1.4. geometry Descripcion: Este metodo es uno, junto con el resto (no hay que desmerecerer la funcion de ninguno :) ), muy importante ya que nos permitira indicar tanto el tamaño de la ventana como su posici on, esto nos permitira trabajar con varias ventanas de una forma mas prolija y agradable para el usuario si se planifican bien los objetivos y se utilizan las herrramientas adecuadas en este caso hablaremos de 'geometry'. Para su utilizacion tenemos dos posibilidades una es indicar solo el tamaño de la ventana usando la siguiente forma root.geometry("WxH")
o indicando ademas del tamaño de la ventana la posicion de la misma de la siguiente forma root.geometry("WxH±X±Y")
El ancho y el alto deben ser reemplazados por las letras W y H respectivamente, separadas por una letra 'x' y su valor debera ser en pixeles, seguido de estos dos pueden ir de manera opcional dos valores mas que indicaran la posicion de la ventana en la pantalla donde se debera indicar estos valores, tambien en pixeles, para el eje x y el eje y. Una observacion que se debe hacer es que los valores que tome tanto el ancho como el alto de la ventana ademas de ser unicamente en pixeles deberan de ser numeros enteros positivos. El significado del signo mas y menos indica que si se le pasa un valor positivo este sera contado desde la esquina superior izquierda de la pantalla en cambio si le pasamos un valor negativo este sera tomado en cuenta partiendo como origen desde la esquina inferior derecha; este es un detalle que hay que tener muy en cuenta cuando deseamos posicionar una ventana. http://eliluminado.alwaysdata.net/Guia Tkinter
21 / 33
Interfaz gráfica con Tkinter
26/09/2013
Si no le dieramos argumentos nos devolveria la medida y la posicion de la ventana. Argumentos: "wxh±x±y" Donde las letras tienen este significado: w: Ancho de la ventana en pixeles h: Alto de la ventana en pixeles x: Posicion en el eje X y: Posicion en el eje Y Ejemplos: #!/usr/bin/env python import Tkinter # Primer ventana con valores positivos primer_ventana = Tkinter.Tk() primer_ventana.geometry("300x300+0+0") # A modo estetico le di un titulo primer_ventana.title("Posicion x=+0 y=+0") # Este tambien es estetico y no influye en el uso del metodo etiqueta = Tkinter.Label(primer_ventana, text="Posicion x=+0 y=+0", width=100, height=100, anchor="center") etiqueta.pack() # Segunda ventana con valores negativos segunda_ventana = Tkinter.Tk() segunda_ventana.geometry("300x300-0-0") segunda_ventana.title("Posicion x=-0 y=-0") etiqueta = Tkinter.Label(segunda_ventana, text="Posicion x=-0 y=-0", width=100, height=100, anchor="center") etiqueta.pack() primer_ventana.mainloop() segunda_ventana.mainloop()
Como se observa se crean dos ventanas donde a una se le pasa valores positivos y a la otra por el contrario sus valores seran negativos. Si no le pasamos ningun argumento nos devolveria el tamaño y la posicion de la ventana como vemos a continuacion: Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import Tkinter >>> root = Tkinter.Tk() >>> root.geometry() '200x200+0+24' >>> root.geometry("400x400+50+50") '' >>> root.geometry() '400x400+50+50' >>>
5.1.5. maxsize Descripcion: Establece los valores maximos de la medida de la ventana, tanto su ancho como su alto. Estos valores se entregan en pixeles siendo el primer valor el ancho y el segundo el largo, aunque el orden de estos valores pueden alterarse como se observa en los ejemplos. Argumentos: (W, H) Donde: W = Ancho (Width) H = Alto (Height) o tambien de esta forma width=W hei ht=H http://eliluminado.alwaysdata.net/Guia Tkinter
22 / 33
Interfaz gráfica con Tkinter
26/09/2013
Ejemplos: root.geometry("300x300") root.maxsize(400, 600) root.geometry("300x300") root.maxsize(height=600, witdh=400)
5.1.6. minsize Descripcion: Establece los valores minimos de la medida de la ventana, tanto su ancho como su alto. Estos valores se entregan en pixeles siendo el primer valor el ancho y el segundo el largo, aunque el orden de estos valores pueden alterarse como se observa en los ejemplos. Argumentos: (W, H) Donde: W = Ancho (Width) H = Alto (Height) o tambien de esta forma (width=W, height=H) Ejemplos: root.geometry("300x300") root.minsize(400, 600) root.geometry("300x300") root.minsize(height=600, witdh=400)
5.1.7. state Descripcion: Podemos cambiar el estado en el que se encuentra la ventana a 'normal', 'iconic' o 'withdraw'. Con la opcion 'normal' la ventana se comporta normalmente apareciendo en la ventana, con la opcion 'iconic' obtenemos los mismos resultados que el metodo 'iconify()' minimizando la ventana y por ultimo con 'withdraw' obtendremos como se imaginaran el mismo resultado que con 'withdraw' ocultando la ventana. Argumentos: newstate=ESTADO Donde ESTADO toma estos valores: "normal" "withdraw" "iconic"
Ejemplos: import Tkinter import time def
funcion(): root.state(newstate='withdraw') time.sleep(5) root.state(newstate='normal')
root = Tkinter.Tk() boton = Tkinter.Button(root, text="Probando el metodo state", command=funcion) boton.pack() root.mainloop()
5.1.8. resizable
http://eliluminado.alwaysdata.net/Guia Tkinter
23 / 33
Interfaz gráfica con Tkinter
26/09/2013
Descripcion: Nos permite indicar que si la ventana debe o no poder redimensionarse ya sea en su ancho o el su alto, dandole a sus parametros 'width'(Ancho) y 'height' (Largo) los valores 'True' o 'F alse'. Con True habilitamos el redimencionamiento y con False los deshabilitamos. Si estamos usando a su ves los metodos 'minsize' y/o 'maxsize' el valor maximo al cual se pueda redimencionar dependera de estos dos metodos en caso de existir. Argumentos: (W, H) Donde: W = Al ancho y puede tomar los valores True o False H = Al alto y puede tomar los valores True o False o tambien esta forma: (width=W, height=H) Ejemplos: Redimencionar solo el ancho: root.resizable(width=True, height=False)
Redimencionar solo el alto: root.resizable(width=False, height=True)
Bloquear el redimencionamiento de la ventana: root.resizable(width=False, height=False)
5.1.9. withdraw Descripcion: Este metodo permite ocultar una ventana; la forma que podemos usar para restaurarla es con 'dei conify()' o 'iconify()', o a traves del metodo 'state' que nos puede resultar mas comodo de usar. No se requiere de ningun argumento para funcionar como sucede tanto con 'deiconify' e 'iconify'. root.withdraw()
Argumentos: No tiene Ejemplos: #!/usr/bin/env python import Tkinter import time def
funcion(): root.withdraw() time.sleep(5) root.deiconify()
root = Tkinter.Tk() boton = Tkinter.Button(root, text="Probando el metodo withdraw", command=funcion) boton.pack() root.mainloop()
5.1.10. transient Descripcion: Este método lo permite es hacer que una ventana permanezca siempre encima de otra, si la ventana padre se minimiza la ventana que lleva el método '.transient()' también lo hará y si esta ventana padre se cerrara la ventana hija también se cerraría. Argumentos: Ejemplos: http://eliluminado.alwaysdata.net/Guia Tkinter
24 / 33
Interfaz gráfica con Tkinter
26/09/2013
#!/usr/bin/env python import Tkinter root = Tkinter.Tk() root.title("Ventana padre") # Creamos una ventana hija de root otra_ventana = Tkinter.Toplevel(root) otra_ventana.title("Ventana hija") # Este es solo para decoracion etiqueta = Tkinter.Label(otra_ventana, text='Este es un ejemplo de transient') etiqueta.pack() # Posicionamos las dos ventanas para que sea mas claro el ejemplo root.geometry("400x400+100+100") otra_ventana.geometry("200x200+150+150") # Y ahora si llamamos a este metodo otra_ventana.transient(root) root.mainloop()
Como ven si intentan mover la ventana padre observaran que esta permanece siempre debajo de la ventana hija.
5.2. Gestión de la geometría Todos los widgets de Tkinter tienen acceso a métodos específicos para la gestión de la geometría, que tienen como propósito ordenarlos y organizarlos en el área donde están contenidos. Para conseguir esto tenemos tres gestores para la geometría, aunque muchos recomiendan solamente usar solo uno de ellos, esperamos que luego de leer acerca de estos tres seas capaz de elegir el que mas se adapte a tus necesidades y a tu forma de trabajar.
5.2.1. pack .
5.2.2. grid .
5.2.3. place .
5.3. Frame 5.4. Colores Todos los widgets estándar de Tkinter proporcionan un conjunto básico de opciones para poder personalizarlos, que nos permiten modificar sus colores, fuentes, bordes y tamaños entre otros. La mayoría de ellos permite especificar un color de fondo y de primer plano que nos serán muy útiles cuando intentemos darle un aspecto mas pulido a nuestra aplicación. Para especificar dichos colores tenemos dos formas, una es utilizar el nombre del color y la otra consiste en especificar la proporción de rojo, verde y azul que componen a dicho color en dígitos hexadecimales que es la forma mas popular y la mas precisa a la hora de trabajar.
5.4.1. Nombres de colores Como se había mencionado se puede especificar un color con solo usar su nombre en ingles, por ejemplo para el color blanco usaríamos la palabra 'white' y para el color rojo 'red', aunque Tkinter no nos limita a usar solamente los colores básicos sino que nos ofrece una paleta bastante amplia de colores. Les dejo dos ejemplos para que puedan observarlo en funcionamiento: boton = Tkinter.Button(root, text="Que te parece la guia?", command=funcion, background="red")
boton = Tkinter.Button(root, text="Que te parece la guia?", command=funcion, background="CadetBlue")
Otra de las posibilidades que tenemos es utilizar los colores del sistema para conseguir un aspecto mas acorde a la plataforma con que estemos trabajando. Podemos obtener una lista de los posibles colores que nos da Tcl/Tk en la siguiente pagina [http://www.tcl.tk/man/tcl8.5/TkCmd/colors.htm ] o también en los anexos de esta guía los podrán encontrar: http://eliluminado.alwaysdata.net/Guia Tkinter
25 / 33
Interfaz gráfica con Tkinter
26/09/2013
5.4.2. RGB hexadecimal Aunque este método sea un poco mas complicado en su uso, es mas preciso que el método que habíamos mencionado arriba. La forma en que se utiliza es la siguiente: #RRGGBB Donde RR, GG y BB son representaciones hexadecimales de los colores rojo, verde y azul, respectivamente. Para formar un color debemos en primer lugar elegir la intensidad que deseamos usar, especificando la cantidad de rojo, verde y azul en una escala del 0 al 255. Usando la siguiente linea desde la consola de Python podemos crear nuestros colores para Tkinter reemplazando los valores de la tupla por los que deseamos utilizar: color_rojo = "#%02x%02x%02x" % (255, 0, 0)
Su uso es muy simple, solo debemos usar la forma que habíamos visto cuando coloreamos usando los nombres p ero ahora deberemos reemplazar el nombre del color por su equivalente en el valor RBG Hexadecimal como en el siguiente ejemplo: boton = Tkinter.Button(root, text="Que te parece la guia?", command=función, background="#FA0000")
Donde "#FA0000" es el equivalente a utilizar la cadena 'red' para indicar el nombre del color.
5.4.3. Consejos En esta parte final de la seccion colores nos detendremos un momento para analizar la utilizacion de colores en nuestra aplicacion y la utilizacion de paletas y esquemas de colores que nos permitan conseguir aspectos mas prolijos y agradables a la vista.
5.5. Fuentes 5.6. Unidades de medida En Tkinter podemos especificar las medidas de los elementos no solo en píxeles sino que también podemos especificar los valores en centímetros, pulgadas, milímetros y puntos; para esto debemos pasar el valor como cadena que se compone de un numero entero o no (porque también podemos usar decimales en caso de ser necesario), seguido de una letra que indique el tipo de unidad a utilizar, que están especificados en la siguiente tabla:
Símbolo
Descripción
c i m p
Centímetros Pulgadas Milímetros Puntos de impresora (alrededor de 0.35mm)
Si el valor que se pasa es un numero sin letra de unidad este es considerado como un valor en píxeles, siendo esta unidad el valor por defecto. Ejemplos: Píxeles: boton = Tkinter.Button(root, text="Hola Mundo!!!", borderwidth=10)
Centímetros: boton = Tkinter.Button(root, text="Hola Mundo!!!", borderwidth='1c')
Pulgadas: boton = Tkinter.Button(root, text="Hola Mundo!!!", borderwidth='1i')
Milímetros: boton = Tkinter.Button(root, text="Hola Mundo!!!", borderwidth='10m')
Puntos: boton = Tkinter.Button(root, text="Hola Mundo!!!", borderwidth='10 ') http://eliluminado.alwaysdata.net/Guia Tkinter
26 / 33
Interfaz gráfica con Tkinter
26/09/2013
Estas unidades de medida a excepción de los píxeles, no es recomendable usarlos ya que no están pensados específicamente para trabajar con elementos de la pantalla de nuestro ordenador y al usarlos es muy probable que no consiga mos los tamaños o proporciones que esperábamos en la pantalla, por ejemplo los puntos se utiliza muy frecuentemente para la impresión ya que fueron diseñados para ese propósito y lo mismo pasa con los milímetros o las pulgadas que fueron diseñadas para otros ámbitos.
5.7. Imágenes 5.7.1. PhotoImage 5.7.2. PIL
6. Menús y barras de herramientas 7. Ventanas de diálogos 8. Eventos 9. Ejemplos Avanzados 10. Notas finales 11. Enlaces de interés Tcl/Tk 8.5 Manual Entorno grafico en Python Interfaces gráficas de usuario en Python Python » GUI Tk Thinking in Tkinter An Introduction to Tkinter Tkinter 8.4 reference: a GUI for Python
12. Glosario toolkit widgets Es un termino genérico para referirse a cualquiera de los elementos básicos que componen la interfaz gráfica de una aplicación. Ejemplos de widgets son botones, etiquetas, cuadros de texto, etc.
13. Anexos 13.1. Colores Paleta de colores de Tk: Paleta de colores del sistema Mac OS X: En Mac OS X, los siguientes colores adicionales del sistema están disponibles (tenga en cuenta que los valores de color reales dependen del tema de sistema operativo actualmente activo). systemActiveAreaFill systemAlertActiveText systemAlertBackgroundActive systemAlertBackgroundInactive
http://eliluminado.alwaysdata.net/Guia Tkinter
27 / 33
Interfaz gráfica con Tkinter
26/09/2013
systemAlertInactiveText systemAlternatePrimaryHighlightColor systemAppleGuideCoachmark systemBevelActiveDark systemBevelActiveLight systemBevelButtonActiveText systemBevelButtonInactiveText systemBevelButtonPressedText systemBevelButtonStickyActiveText systemBevelButtonStickyInactiveText systemBevelInactiveDark systemBevelInactiveLight systemBlack systemBlackText systemButtonActiveDarkHighlight systemButtonActiveDarkShadow systemButtonActiveLightHighlight systemButtonActiveLightShadow systemButtonFace systemButtonFaceActive systemButtonFaceInactive systemButtonFacePressed systemButtonFrame systemButtonFrameActive systemButtonFrameInactive systemButtonInactiveDarkHighlight systemButtonInactiveDarkShadow systemButtonInactiveLightHighlight systemButtonInactiveLightShadow systemButtonPressedDarkHighlight systemButtonPressedDarkShadow systemButtonPressedLightHighlight systemButtonPressedLightShadow systemButtonText systemChasingArrows systemDialogActiveText systemDialogBackgroundActive systemDialogBackgroundInactive systemDialogInactiveText systemDocumentWindowBackground systemDocumentWindowTitleActiveText systemDocumentWindowTitleInactiveText systemDragHilite systemDrawerBackground systemFinderWindowBackground systemFocusHighlight systemHighlight systemHighlightAlternate systemHighlightSecondary systemHighlightText systemIconLabelBackground systemIconLabelBackgroundSelected systemIconLabelSelectedText systemIconLabelText systemListViewBackground systemListViewColumnDivider systemListViewEvenRowBackground systemListViewOddRowBackground systemListViewSeparator systemListViewSortColumnBackground systemListViewText systemListViewWindowHeaderBackground systemMenu systemMenuActive systemMenuActiveText systemMenuBackground systemMenuBackgroundSelected systemMenuDisabled systemMenuItemActiveText systemMenuItemDisabledText systemMenuItemSelectedText systemMenuText systemMetalBackground systemModelessDialogActiveText systemModelessDialogBackgroundActive systemModelessDialogBackgroundInactive systemModelessDialogInactiveText systemMovableModalBackground systemMovableModalWindowTitleActiveText systemMovableModalWindowTitleInactiveText systemNotificationText systemNotificationWindowBackground systemPlacardActiveText systemPlacardBackground systemPlacardInactiveText http://eliluminado.alwaysdata.net/Guia Tkinter
28 / 33
Interfaz gráfica con Tkinter
26/09/2013
systemPlacardPressedText systemPopupArrowActive systemPopupArrowInactive systemPopupArrowPressed systemPopupButtonActiveText systemPopupButtonInactiveText systemPopupButtonPressedText systemPopupLabelActiveText systemPopupLabelInactiveText systemPopupWindowTitleActiveText systemPopupWindowTitleInactiveText systemPrimaryHighlightColor systemPushButtonActiveText systemPushButtonInactiveText systemPushButtonPressedText systemRootMenuActiveText systemRootMenuDisabledText systemRootMenuSelectedText systemScrollBarDelimiterActive systemScrollBarDelimiterInactive systemSecondaryGroupBoxBackground systemSecondaryHighlightColor systemSheetBackground systemSheetBackgroundOpaque systemSheetBackgroundTransparent systemStaticAreaFill systemSystemDetailText systemTabFrontActiveText systemTabFrontInactiveText systemTabNonFrontActiveText systemTabNonFrontInactiveText systemTabNonFrontPressedText systemTabPaneBackground systemToolbarBackground systemTransparent systemUtilityWindowBackgroundActive systemUtilityWindowBackgroundInactive systemUtilityWindowTitleActiveText systemUtilityWindowTitleInactiveText systemWhite systemWhiteText systemWindowBody systemWindowHeaderActiveText systemWindowHeaderBackground systemWindowHeaderInactiveText
Paleta de colores del sistema Windows: En Windows, los siguientes colores adicionales del sistema están disponibles (tenga en cuenta que los valores de color reales dependen del tema de sistema operativo actualmente activo). 3dDarkShadow 3dLight ActiveBorder ActiveCaption AppWorkspace Background ButtonFace ButtonHighlight ButtonShadow ButtonText CaptionText DisabledText GrayText Highlight HighlightText InactiveBorder InactiveCaption InactiveCaptionText InfoBackground InfoText Menu MenuText Scrollbar Window WindowFrame WindowText
Paleta de colores X11:
14. Licencia http://eliluminado.alwaysdata.net/Guia Tkinter
29 / 33
Interfaz gráfica con Tkinter
26/09/2013
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License. 3. "Creative Commons Compatible License" means a license that is listed at http://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License. 4. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
"License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. 5. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this Lice nse. 6. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) i n the case of broadcasts, the organization that transmits the broadcast. 7. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. 8. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. 9. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. 10. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
http://eliluminado.alwaysdata.net/Guia Tkinter
30 / 33
Interfaz gráfica con Tkinter
26/09/2013
2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, nonexclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, 4. to Distribute and Publicly Perform Adaptations. 5. For the avoidance of doubt: 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as req uired by Section 4(c), as requested. 2. You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recip ient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. 3. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicab le) if supplied, and/or if the Original http://eliluminado.alwaysdata.net/Guia Tkinter
31 / 33
Interfaz gráfica con Tkinter
26/09/2013
Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Ssection 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. 4. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not speci fied here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the http://eliluminado.alwaysdata.net/Guia Tkinter
32 / 33