Tutorial TKInter Python (GUI) Parte 6

RESUMEN INTERFAZ GRÁFICA
VI PARTE
5 Noviembre del 2010
 
Autor: Grupo 50, Segundo Semestre 2010 (Sede San Carlos)
 
22. HACER QUE DOS LISTAS INTERACTÚEN
 
Supongamos que necesitamos que dos listas interactúen entre sí. Una lista contiene grupos, y otra lista contiene personas.
 Cuando yo hago click en uno de los grupos de la lista, entonces la otra lista se llena con todas las personas que
 pertenezcan a ese grupo.
Para este ejemplo utilizaremos las carreras que se imparten en la Sede de San Carlos, con algunos nombres de personas.
 Además cuando le damos click al nombre de una persona, en la consola se imprime dicho nombre.
Ejemplo 34
 
# -*- coding: utf-8 -*-
from Tkinter import *
 
v0=Tk()
v0.resizable(0,0)
v0.title("Dos Listbox")
gsel=StringVar()
switch=[0]
 
def llenar_listbox(lista,listbox):
    ind,largo=0,len(lista)
    while listbox.size() > 0: # Un while para limpiar el listbox
        listbox.delete(0)
    while ind < largo: # Un while que inserta todos los elementos en una lista
        listbox.insert(END,lista[ind])
        ind+=1
 
def vargrupo():
    v0.after(200,vargrupo)
    if l2.curselection() != ():
        print l2.get(l2.curselection())
    if l1.curselection() != ():
        gsel.set(l1.get(l1.curselection()))
    if gsel.get() == "Computacion":
        llenar_listbox(Compu,l2)
    if gsel.get() == "Agronomia":
        llenar_listbox(Agro,l2)
    if gsel.get() == "Administracion":
        llenar_listbox(Turistas,l2)
    if gsel.get() == "Turismo":
        llenar_listbox(Admin,l2)
 
ListaCarreras=["Computacion","Agronomia", "Administracion","Turismo"]
Compu=["Ana","Alejandra","Ronald","Andrey"]
Agro=["Jefry"]
Turistas=["Laura","Jose María"]
Admin=["Andrea","Roberta"]
 
l1=Listbox(v0)
l1.grid(row=1,column=0)
l2=Listbox(v0)
l2.grid(row=1,column=1)
b1=Button(v0,text="SALIR",width=40,command=v0.destroy)
b1.grid(row=2,column=0,columnspan=2)
 
vargrupo()
llenar_listbox(ListaCarreras,l1)
v0.mainloop()
 
http://i.imgur.com/Sqzhj.jpg 
 
Para este ejemplo utilizamos: 
 
controlistbox.curselection(): Es la posición en la que se encuentra el elemento dentro del listbox. La posición inicial es
 cero.
 
controlistbox.get(número) : Recibe un número y devuelve un string con el elemento que se encuentra en esa posición.
 
Y por lo tanto, controlistbox.curselection(controlistbox.get(número)) retorna el elemento que estamos clickeando en ese
 momento. Si llamamos con ventana.after(tiempo,función) podemos lograr que nos retorne el elemento clickeado. Eso es
 precisamente lo que ocurre en este ejemplo.
 
 
23. UN ACELERADOR, EL EVENTO VENTANA.AFTER(TIEMPO,FUNCIÓN)
 
Cuando hacemos un while o un for, y queremos que se nos impriman datos en la pantalla, nosotros no podemos controlar la
 velocidad en la que esos datos se imprimirán.
 
Ejemplo 35
El ejemplo siguiente muestra como crear un acelerador, donde nos vaya imprimiendo algo como lo siguiente:
 
1 Km/h
2 Km/h
3 Km/h
...
100 Km/h
101 Km/h
 
Y cada vez lo vaya imprimiendo más rápido. Cuando llega al punto máximo de velocidad, entonces comienza a retroceder hasta
 llegar al 0 Km/h. 
 
¿Con qué propósito? Para comprender de mejor manera como funciona el evento ventana.after(). 
Para este ejemplo imprimiremos en cónsola y además cambiaremos el valor de una StrinVar() que controla el texto de un
 control de tipo Label
# -*- coding: utf-8 -*-
from Tkinter import *
 
v0=Tk()
v0.resizable(0,0)
v0.title("ACELERADOR")
speed=StringVar()
label1=Label(v0,textvar=speed,font=(20)).grid()
b1=Button(v0,text="TERMINAR KILOMETRAJE",command=v0.destroy,font=(16)).grid()
 
gas=[180]
limite=[1]
velocidad=[1]
switch=[1]
 
def acelerador():
    v0.after(gas[0],acelerador)
    if gas[0] > limite[0] and switch[0]==1:
        gas[0]-=1
        print "Vamos a",velocidad[0],"Km/h"
        speed.set("Vamos a " + str(velocidad[0]) + " Km/h")
        velocidad[0]+=1
    else:
        switch[0] = 0
        limite[0]= 180
    if gas[0] < limite[0] and switch[0]==0:
        gas[0]+=1
        print "Vamos a",velocidad[0],"Km/h"
        speed.set("Vamos a " + str(velocidad[0]) + " Km/h")
        velocidad[0]-=1
    else:
        if switch[0]==0:
            switch[0]=1
            gas[0]=180
            velocidad[0]=1
            limite[0]= 1
          
acelerador()
v0.mainloop()
 
 
http://i.imgur.com/5X4P6.jpg  
 
El evento ventana.after(tiempo,función) ha sido utilizada a lo largo de este tutorial y sirve para multitud de eventos
 aunque no es el más adecuado a la hora de realizar algunas tareas.
 
24. UTILIZANDO GRID, PARA ACOMODAR EXACTAMENTE A NUESTRO ANTOJO
 
Supongamos que queremos tener una ventana con varios elementos pero que esos elementos estén acomodados de acuerdo a la
 manera en la que nosotros queremos que estén. Muchas veces tenemos una idea y a la hora de llevarla a la interfaz no se ve
 como nosotros queremos. Y muchas de esas veces esto sucede porque no tenemos una herramienta eficaz dentro del módulo de
 la interfaz que nos permita acomodar las cosas con algo más que paneles. En Python por suerte tenemos el método grid, y
 este nos permite acomodar las cosas a nuestro antojo. 
 
Ejemplo 36
Si dibujamos una interfaz, por ejemplo:
http://i.imgur.com/kWa95.jpg  
 
Queremos esta estructura, donde cada cajita es un botón. Esto lo podemos hacer con grid. Solo debemos pensar en cada
 elemento como si este fuera parte de una matriz.
 
# -*- coding: utf-8 -*-
from Tkinter import *
 
v0=Tk()
v0.resizable(0,0)
v0.title("GRID")
 
Button(v0,width=25,height=7).grid(row=0,column=0,rowspan=2)
Button(v0,width=25,height=7).grid(row=1,column=0,rowspan=2)
Button(v0,width=25,height=7).grid(row=0,column=1)
Button(v0,width=25,height=7).grid(row=1,column=1)
Button(v0,width=25,height=7).grid(row=2,column=1)
Button(v0,width=25,height=7).grid(row=0,column=2,rowspan=2)
Button(v0,width=25,height=7).grid(row=1,column=2,rowspan=2)
 
 
v0.mainloop()
 
Ejemplo 37
 
 
Otra forma como la siguiente:
 
http://i.imgur.com/YT0KW.jpg 
 
Se puede hacer fácilmente con 
 
# -*- coding: utf-8 -*-
from Tkinter import *
 
v0=Tk()
v0.resizable(0,0)
v0.title("GRID")
 
Button(v0,width=6,height=3).grid(row=0,column=0)
Button(v0,width=6,height=3).grid(row=0,column=2)
Button(v0,width=6,height=3).grid(row=0,column=3)
Button(v0,width=6,height=3).grid(row=0,column=4)
Button(v0,width=6,height=3).grid(row=0,column=5)
Button(v0,width=6,height=3).grid(row=0,column=6)
Button(v0,width=6,height=3).grid(row=0,column=7)
Button(v0,width=6,height=3).grid(row=0,column=8)
Button(v0,width=6,height=3).grid(row=0,column=9)
Button(v0,width=6,height=3).grid(row=0,column=10)
Button(v0,width=6,height=3).grid(row=0,column=11)
Button(v0,width=6,height=3).grid(row=1,column=0)
Button(v0,width=6,height=3).grid(row=2,column=0)
Button(v0,width=6,height=3).grid(row=3,column=0)
Button(v0,width=6,height=3).grid(row=4,column=0)
Button(v0,width=6,height=3).grid(row=5,column=0)
Button(v0,width=6,height=3).grid(row=6,column=0)
Button(v0,width=6,height=3).grid(row=7,column=0)
Button(v0,width=6,height=3).grid(row=8,column=0)
Button(v0,width=6,height=3).grid(row=1,column=11)
Button(v0,width=6,height=3).grid(row=2,column=11)
Button(v0,width=6,height=3).grid(row=3,column=11)
Button(v0,width=6,height=3).grid(row=4,column=11)
Button(v0,width=6,height=3).grid(row=5,column=11)
Button(v0,width=6,height=3).grid(row=6,column=11)
Button(v0,width=6,height=3).grid(row=7,column=11)
Button(v0,width=6,height=3).grid(row=8,column=11)
Button(v0,width=6,height=3).grid(row=8,column=2)
Button(v0,width=6,height=3).grid(row=8,column=3)
Button(v0,width=6,height=3).grid(row=8,column=4)
Button(v0,width=6,height=3).grid(row=8,column=5)
Button(v0,width=6,height=3).grid(row=8,column=6)
Button(v0,width=6,height=3).grid(row=8,column=7)
Button(v0,width=6,height=3).grid(row=8,column=8)
Button(v0,width=6,height=3).grid(row=8,column=9)
Button(v0,width=6,height=3).grid(row=8,column=10)
Button(v0,width=66,height=25,text="UN GRAN CLICK").grid(row=1,column=1,rowspan=7,columnspan=10)
 
v0.mainloop()
 
Ejemplo 38
 
Y un formulario de contacto:
# -*- coding: utf-8 -*-
from Tkinter import *
 
v0=Tk()
v0.resizable(0,0)
v0.title("FORMULARIO")
Label(v0,text="Formulario de Contacto",width=50).grid(row=0,column=0,columnspan=4)
Label(v0,text="Nombre: ").grid(row=1,column=0,sticky=W)
Entry(v0).grid(row=1,column=2)
Label(v0,text="Email: ").grid(row=2,column=0,sticky=W)
Entry(v0).grid(row=2,column=2)
Label(v0,text="Teléfono: ").grid(row=3,column=0,sticky=W)
Entry(v0).grid(row=3,column=2)
Label(v0,text="Profesión: ").grid(row=4,column=0,sticky=W)
Entry(v0).grid(row=4,column=2)
Label(v0,text="Cédula: ").grid(row=5,column=0,sticky=W)
Entry(v0).grid(row=5,column=2)
l1=Listbox(v0,height=6)
l1.grid(row=0,column=3,rowspan=20)
l1.insert(END,"Costa Rica"),l1.insert(END,"Croacia"),l1.insert(END,"Estados Unidos")
Button(v0,text="Registrar",width=50).grid(row=10,column=0,columnspan=4)
 
v0.mainloop()
http://i.imgur.com/A8S2f.jpg 
 
25. COMPRENDIENDO LOS CONTROLES COMO OBJETOS
 
Aún nos falta mucho para comprender del todo los objetos. Sin embargo en Python, está claro que cada control de la interfaz
 Tkinter es un objeto. Por lo tanto, podemos hacer todo lo que hacemos con nuestros objetos, pero utilizando controles de
 interfaz.
 
Ejemplo 39
Por ejemplo podemos crear una función, que al introducirle un número, nos cree una cantidad de botones en la ventana.
# -*- coding: utf-8 -*-
from Tkinter import *
 
v0=Tk()
v0.resizable(0,0)
v0.title("OBJETOS")
 
def crear_botones(n):
    ind,acumulador,fila,columna=1,0,0,0
    while ind <= n:
        Button(v0,text=" " + str(ind) + " ",width=2).grid(row=fila,column=columna)
        if acumulador==39: fila,columna,acumulador=fila+1,0,0
        else: acumulador,columna=acumulador+1,columna+1
        ind+=1
    
crear_botones(600)
v0.mainloop()
 
http://i.imgur.com/rcelU.jpg 
 
26. BINARIUM
 
Finalmente para acabar con la parte de animaciones y ventana.after, en este ejemplo se presentan varias funciones. La idea
 es que podamos analizarla y saber que hace cada función (Por lo que los nombres de todos los elementos son representados por letras)
 
Ejemplo 40
 
# -*- coding: utf-8 -*-
from Tkinter import *
 
a=Tk()
a.resizable(0,0)
a.geometry("550x400")
a.title("BINARIUM")
b=StringVar()
b.set("""
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
 
""")
c="""
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
1001010101010010010101010010110010101010100100101010100101
0100101010101001001010101001001001010101010010010101010010
"""
 
def ds(h):
    f,g=0,len(h)
    while f < g:
        if h[f] != " ":
            return False
            break
        f+=1
    return True
 
def s(h):
    taud=h
    if not ds(h):
        h = " " + h[0:-1]
        return h
    else: return c
 
def j(t): print t
 
def i():
    a.after(1,i)
    b.set(s(b.get()))
 
label1=Label(a,textvar=b,font=(16)).pack(side=TOP)
i()
a.mainloop()

No hay comentarios:

Publicar un comentario

gmendezm
Portada
Lista Principal