[Programación]GUI en python con TkInter...
Emiliano Gavilán
emilianogavilan en gmail.com
Mar Ago 3 16:45:02 ART 2010
On Tue, Aug 03, 2010 at 12:10:24PM -0700, Horacio Castellini wrote:
> > 8<--------8<--------8<--------8<--------8<--------8<--------8<--------
>
> Retomando el tema de la GUI y viendo que esto que me pasaste es lo que
> busco, te voy haciendo preguntas ya que los tutorial sobre el tema son
> chotos... así que para empezar viene algunas preguntas..
>
> > from Tkinter import *
> > import tkFileDialog
> > # los demas imports
> >
> > def definir_archivo():
> > """Selecciona el archivo a procesar"""
> > global fe
> > fname = tkFileDialog.askopenfilename()
> > if fname:
> > fe.delete(0, END)
> > fe.insert(0, fname)
>
> Que cuernos estás haciendo acá? "fe" es una lista, en la cual le pasas el
> descriptor (eso es en C :)) ) a un archivo... porque no lo hiciste así
>
> if fname:
> fe=[]
> fe.append(fname)
"fe" es el campo de texto que contiene el nombre del archivo a procesar, no el
file descriptor. Como tal, estoy usando los métodos que permiten manipular el
valor almacenado y mostrado.
"delete" toma dos índices entre los cuales va a borrar el texto (0 es el
primero y END es un mnemónico para el último) por lo que lo que se hace es
limpiar el valor que había previamente.
"insert" toma como primer parámetro el índice en el que se va a insertar el
texto (que en este caso es 0 ya que no hay nada) y se inserta el valor
retornado por el diálogo.
El "if fname:" es porque si cancelás el diálogo, no hay nada que hacer ...
>
> >
> > def procesar():
> > """Procesa el archivo e inserta los resultados en los campos"""
> > global fe
> > global res
> > fname=fe.get()
>
> porque no fname=fe[0]?
Por lo mismo que arriba: fe no es un string, sino el cuadro de texto en el que
esta almacenado el nombre del archivo a procesar. El método para leer lo que
hay en el mismo es "get".
>
> > if not fname:
> > return
> > # Aca va el calculo
> > # yo pondria asi :
> > # (cum, suav, var, U) = procesarImagen(fname)
> > # y procesarImagen deberia retornar una tupla con los valores.
> > # Notar que si procesarImagen da un error, en el mundo de las
> > # GUI es considerado buena practica hacer un cuadro de dialogo
> > # explicando que fallo y permitir reintentar. Una forma seria
> > # retornar (None,)*4 y comprobar esa condicion.
> > # por ahora simulemos los resultados
> > import random
> > cum = random.random()
> > suav = random.random()
> > var = random.random()
> > U = random.random()
> > # .... fin calculos
> > for e, val in zip(res,[cum, suav, var, U]):
> > e.configure(state="normal")
> > e.delete(0,END)
> > e.insert(END, val)
> > e.configure(state="readonly")
> >
>
> Acá directamente me estoy dando la cabeza contra la pared de como cuerno
> pasan estos parámetros al frame...
"res" es una lista (global) que tiene cuatro elementos, que son cada uno de los
cuadros de texto del resultado. Dentro del bucle, estaría haciendo
"para cada par (entrada,valor), activar la entrada, borrar su contenido,
insertar el valor calculado y volver al estado readonly así no se puede cambiar
a mano".
Acá hay que notar que en la función hacerGUI() están creados en el mismo orden
que se iteran los resultados (cum, suav, var y U).
> > def hacerGUI():
> > global res
> > global fe
> >
> > root=Tk()
> > # frame superior con una etiqueta, una entrada de texto y un
> > # boton para cargar el archivo
> > ff=Frame(root)
> > fl=Label(ff,text="Archivo a analizar:")
> > fe=Entry(ff)
> > fb=Button(ff,text="...", command=definir_archivo)
> > # geometry management
> > fb.grid(row=0, column=2, padx=3)
> > fe.grid(row=0, column=1, padx=3, sticky=EW)
> > fl.grid(row=0, column=0, padx=3)
> > ff.grid_columnconfigure(1, weight=1)
> >
> > # Frame de resultados
> > rf=Frame(root)
> > res=[]
> > for i,txt in enumerate(['Entro:','Suavidad:','Var:','U:']):
> > l = Label(rf,text=txt)
> > e = Entry(rf, state="readonly", readonlybackground="white", selectbackground="#4a6984")
> > res.append(e)
> > l.grid(column=0, row=i, sticky=E, pady=3, padx=12)
> > e.grid(column=1, row=i, sticky=NSEW, pady=3)
> > rf.grid_columnconfigure(1,weight=1)
> > # frame de control/salida
> > cf=Frame(root)
> > cg=Button(cf, text="Procesar", width=12, command=procesar)
> > ce=Button(cf, text="Salir", width=12, command=exit)
> > # geometry management
> > cg.grid(column=0, row=0, padx=12, sticky=E)
> > ce.grid(column=1, row=0, padx=12, sticky=W)
> > cf.grid_columnconfigure(0, weight=1)
> > cf.grid_columnconfigure(1, weight=1)
> >
> > # finalmente le damos al geometry manager los tres frames
> > ff.pack(fill=X, padx=3, pady=3)
> > cf.pack(expand=1, fill=BOTH, side=BOTTOM, pady=3, padx=3)
> > rf.pack(fill=BOTH, expand=1, padx=6, pady=6)
> > # opciones de la ventana:
> > # solo permitimos cambiar el tamanio horizontalmente
> > root.wm_resizable(1,0)
> > # titulo de la ventana
> > root.wm_title("SuperProgramejo 1.0")
> >
> > hacerGUI()
> > mainloop()
Emiliano
Más información sobre la lista de distribución Programacion