Tutorial TKInter Python (GUI) Parte 3

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()
 
 
http://i.imgur.com/3FTau.jpg 
 
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()
 
http://i.imgur.com/Uaf76.jpg 
 
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()
 
http://i.imgur.com/BtCZB.jpg 
 
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()
 
 
http://i.imgur.com/LxKrW.jpg 
 
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()
 
http://i.imgur.com/fmfOQ.jpg 
 
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()
 
http://i.imgur.com/EnaHg.jpg 
 
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

gmendezm
Portada
Lista Principal