RESUMEN INTERFAZ GRÁFICA
TERCERA PARTE
3 Noviembre del 2010
Autor: Grupo 50, Segundo Semestre 2010 (Sede San Carlos)
10. PROPIEDADES DE LOS CONTROLES (Parte 2)
Ejemplo 17:
Ahora, suponiendo que tenemos una lista de cosas, y queremos que esa lista de cosas se inserten, una a una, en un listbox.
Para cosas como estas debemos implementar funciones , ya que de otra manera estaríamos repitiendo mucho código y
saturando nuestro proyecto, mientras que una función resume muchas instrucciones y lo hace más comprensible.
Esta es una solución para realizarlo:
from Tkinter import *
v0=Tk()
def colocar_scrollbar(listbox,scrollbar):
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
listbox.pack(side=LEFT, fill=Y)
frame1=Frame(v0)
frame1.pack()
scroll1=Scrollbar(frame1)
list1=Listbox(frame1)
list1.pack()
colocar_scrollbar(list1,scroll1)
def cargarlistbox(lista,listbox):
ind,largo=0,len(lista)
while ind < largo:
listbox.insert(END,lista[ind])
ind+=1
ListaNombres=['Laura','Roger','Fabiola']
cargarlistbox(ListaNombres,list1)
v0.mainloop()
Ejemplo 18:
Este es un ejemplo de cómo imprimir el texto del elemento seleccionado en un Listbox, en un control del tipo Label. Esta es
una de las formas con las que se puede implementar esto:
from Tkinter import *
v0=Tk()
def colocar_scrollbar(listbox,scrollbar):
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
listbox.pack(side=LEFT, fill=Y)
frame1=Frame(v0)
frame1.pack()
scroll1=Scrollbar(frame1)
list1=Listbox(frame1)
list1.pack()
colocar_scrollbar(list1,scroll1)
mitexto=StringVar()
label1=Label(v0,textvar=mitexto)
label1.pack()
def cargarlistbox(lista,listbox):
ind,largo=0,len(lista)
while ind < largo:
listbox.insert(END,lista[ind])
ind+=1
ListaNombres=['Laura','Roger','Fabiola']
def imprimir_en_label():
label1.after(100, imprimir_en_label) # Llamada recursiva con .after
ind = list1.curselection()
if list1.curselection() != ():
sel = list1.get(ind)
mitexto.set(sel)
cargarlistbox(ListaNombres,list1)
imprimir_en_label()
v0.mainloop()
La función imprimir_en_label es la que llama la atención en este caso, es una función que se llama así misma con el evento
objeto.after(tiempo(milisegundos),función).
Cada 100 milisegundos verifica cuál elemento está seleccionado.
Listbox.curselection() retorna la posición seleccionada, y Listbox.get(posición) devuelve el texto seleccionado. Otra forma
de realizar esto es con una implementación de objeto.bind
Ejemplo 18:
Para este ejemplo lo que haremos es una función para limpiar un control del tipo Listbox. La función elimina todos los
elementos del listbox cuando uno le da click al botón ELIMINAR TODOS
from Tkinter import *
v0=Tk()
def colocar_scrollbar(listbox,scrollbar):
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
listbox.pack(side=LEFT, fill=Y)
frame1=Frame(v0)
frame1.pack()
scroll1=Scrollbar(frame1)
list1=Listbox(frame1)
list1.pack()
colocar_scrollbar(list1,scroll1)
mitexto=StringVar()
label1=Label(v0,textvar=mitexto)
label1.pack()
b1=Button(v0,text="ELIMINAR TODOS",command=lambda: limpiar_listbox(list1))
b1.pack()
def cargarlistbox(lista,listbox):
ind,largo=0,len(lista)
while ind < largo:
listbox.insert(END,lista[ind])
ind+=1
ListaNombres=['Laura','Roger','Fabiola','Yendry','Esteban','Marta','Elias']
def imprimir_en_label():
label1.after(100, imprimir_en_label) # Llamada recursiva con .after
ind = list1.curselection()
if list1.curselection() != ():
sel = list1.get(ind)
mitexto.set(sel)
def limpiar_listbox(listbox):
while listbox.size() > 0:
listbox.delete(0)
cargarlistbox(ListaNombres,list1)
imprimir_en_label()
v0.mainloop()
Ejemplo 19:
Para personalizar los colores de los objetos se utilizan:
bg: Se encarga del color de fondo
fg: Se encarga del color del texto
Hay otras propiedades más que se pueden encontrar en documentación sobre Tkinter por la web. Veamos el ejemplo de arriba
más personalizado
from Tkinter import *
v0=Tk()
v0.config(bg="black")
v0.title("Ejemplo personalizado")
v0.geometry("210x190")
def colocar_scrollbar(listbox,scrollbar):
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
listbox.pack(side=LEFT, fill=Y)
frame1=Frame(v0,bg="black")
frame1.pack()
scroll1=Scrollbar(frame1)
list1=Listbox(frame1,bg="black",fg="white")
list1.pack()
colocar_scrollbar(list1,scroll1)
mitexto=StringVar()
label1=Label(v0,textvar=mitexto,bg="black",fg="white")
label1.pack()
b1=Button(v0,text="ELIMINAR TODOS",command=lambda: limpiar_listbox(list1),bg="black",fg="white")
b1.pack()
def cargarlistbox(lista,listbox):
ind,largo=0,len(lista)
while ind < largo:
listbox.insert(END,lista[ind])
ind+=1
ListaNombres=['Laura','Roger','Fabiola','Yendry','Esteban','Marta','Elias']
def imprimir_en_label():
label1.after(100, imprimir_en_label) # Llamada recursiva con .after
ind = list1.curselection()
if list1.curselection() != ():
sel = list1.get(ind)
mitexto.set(sel)
def limpiar_listbox(listbox):
while listbox.size() > 0:
listbox.delete(0)
cargarlistbox(ListaNombres,list1)
imprimir_en_label()
v0.mainloop()
Existen otros elementos personalizables como
width: El ancho
height: El alto
border: Tamaño de borde
En interfaces más avanzadas se puede configurar el nivel de opacidad, logrando así el efecto de transparencia de las
ventanas más conocidas. Pero eso no es tan necesario mencionarlo
11. IMPRIMIENDO LA HORA CON TODO Y FECHA
Existe un módulo en Python llamado time. Utilizando la siguiente implementación se puede conseguir la hora:
Ejemplo 20:
import time
def imprimir_fecha():
return str(time.localtime()[2]) + "/" + str(time.localtime()[1]) + "/" + str(time.localtime()[0]) + ", " + str(time.localtime()[3]) + ":" + str(time.localtime()[4]) + ":" + str(time.localtime()[5])
print imprimir_fecha()
Ejemplo 21:
Si uno deseara, podría conseguir imprimir más información, como los nombres del mes, entre otras cosas.
En el siguiente ejemplo hay una implementación de cómo se consigue imprimir la hora actual en un label.
import Tkinter
from Tkinter import *
import time
def imprimir_fecha():
return str(time.localtime()[2]) + "/" + str(time.localtime()[1]) + "/" + str(time.localtime()[0]) + ", " + str(time.localtime()[3]) + ":" + str(time.localtime()[4]) + ":" + str(time.localtime()[5])
v0=Tk()
v0.title("Hora")
mifecha=StringVar()
l1=Label(v0,textvar=mifecha,font=(16))
l1.pack()
l2=Label(v0,text="",font=(16))
l2.pack()
def refresh_fecha():
v0.after(1000,refresh_fecha)
mifecha.set(imprimir_fecha())
l2.config(text=imprimir_fecha())
refresh_fecha()
v0.mainloop()
Además en este ejemplo podemos ver que existen dos formas de cambiar el texto de un control Label, utilizando
objeto.config(text='loquesea') o creando una variable de tipo StringVar() y modificándola directamente.
El ejemplo sirve incluso para crear efectos animaciones, y textos cambiantes. Eso queda a imaginación del programador.
12. GUARDANDO Y ABRIENDO UN ARCHIVO CON TEXTO
Ahora vamos a hacer uso de varios módulos. Esta aplicación abre una ventana con un control Text y un control Button.
Ejemplo 22:
El siguiente código guarda un archivo de texto en una ruta específicada. Y luego, si cerramos el programa, cuando lo
volvemos a abrir, nos devuelve el texto que guardamos anteriormente (Puedes cambiar el enlace si estás trabajando en
Ubuntu u otro Sistema Operativo que no lee disco C como en Windows)
# -*- coding: utf-8 -*-
import Tkinter
from Tkinter import *
import codecs
import os
v0 = Tkinter.Tk()
v0.config(bg="black")
v0.resizable(0,0)
def doit(f): v0.after(100, f)
def imprimir(textcontrol): print textcontrol.get('1.0', END+'-1c')
def escribir_en_archivo(enlace):
f = codecs.open(enlace,"w","utf-8")
texto = t1.get('1.0', END+'-1c')
f.write(texto)
f.close()
def abrir_archivo(enlace):
if os.path.exists(enlace):
f = open(enlace,"r")
h= f.read()
t1.insert(END,h)
f.close()
t1=Text(v0)
t1.config(bg="black",fg="white")
t1.pack()
b1 = Button(v0,text="<< SAVE >>",command=lambda: doit(escribir_en_archivo('C:\hola.txt')))
b1.config(bg="black",fg="white")
b1.pack()
abrir_archivo('C:\hola.txt')
v0.mainloop()
Este permite guardar y cargar información en archivos de texto, siempre y cuando sea string, lo guardará adecuadamente.
Cabe destacar que este pequeño programa tiene un código un tanto simple, pero tiene algunos detalles interesantes. Por
ejemplo, no es igual utilizar controles Entry (una sola línea) que controles Text (Varias líneas de texto)
Su información es diferente, sus métodos, y algunas cosas para leer y escribir información en un control de tipo Text, es
diferente a la manipulación del objeto Entry. Además en este ejemplo ni siquiera podemos ver toda la capacidad que tiene
el objeto Text. Es uno de los objetos más potentes que tiene la interfaz Tkinter.
El segundo detalle a tomar en cuenta, es que, aunque parezca fácil, no es para nosotros obvio a simple vista que hay algo
en este documento, lo que e conoce como codificación.
La codificación es para que no se nos caiga nuestra aplicación cuando intentemos guardar en un archivo, caracteres tales
como tildes, eñes, y otros caracteres que se necesitan. Para ello incluso se importa un módulo llamado codecs, y se
utiliza utf-8, que les recomiendo realicen una búsqueda en google y revisen la información sobre la diferente codificación
de caracteres.
Otro detalle raro es la forma en la que se consigue el texto de un control del tipo Text
'1.0', END+'-1c'
Cuando en los controles Entry basta con Entry.get(mi_variable_entry)
Finalmente, para cargar el archivo primero se verifica si el archivo existe, esto lo podemos realizar con el módulo os, con
el que podemos verificar si un archivo existe en el sistema, si existe entonces lo abrirá.
13. GUARDANDO Y ABRIENDO LISTAS CON PICKLE
El módulo Pickle permite guardar las listas como estructuras de datos y luego recuperarlas desde el archivo. Esto nos
permitiría guardar toda la información de una lista y recuperarla tal cual.
Ejemplo 23:
En este ejemplo importamos el módulo pickle y creamos unas funciones para guardar y abrir listas.
import pickle
def guardar_lista(lista,ruta):
fichero = file(ruta, "w")
nl=lista
pickle.dump(nl, fichero)
def cargar_lista(ruta):
fichero = file(ruta)
lista_recuperada = pickle.load(fichero)
return lista_recuperada
guardar_lista([1,2,3,4,5,6,7],"datos.txt")
print cargar_lista("datos.txt")
En este ejemplo guardamos una lista con los números del 1 al 7 en el archivo datos.txt que se creará en la misma carpeta
donde está guardado el archivo.py donde se encuentra el código de arriba, pero nosotros podemos cambiar la ruta, por
ejemplo 'C:\datos.txt'
No hay comentarios:
Publicar un comentario