[Programación]GUI en python con TkInter...
Emiliano Gavilán
emilianogavilan en gmail.com
Mie Ago 4 12:53:37 ART 2010
On Wed, Aug 04, 2010 at 06:03:07AM -0700, Horacio Castellini wrote:
>
> Si bien el manual dice que el método "askopenfilename()" toma el nobre un
> archivo para solo lectura pero el objeto que devuelve no está asociado al
> archivo... entonces si lo quiero abrir para solo lectura debería ser algo
> así: (pregunto porque no estoy seguro de lo que digo...)
>
> import sys #Es necesario importar esto?
>
> def definir_archivo():
> """Selecciona el archivo a procesar"""
> global fe
> fname = tkFileDialog.askopenfilename()
> if fname:
> fe.delete(0, END)
> fe.insert(0, fname)
> return open(fname,'r')
askopenfilename() devuelve un string con la ruta al archivo a abrir, o None en
caso de haber cancelado el diálogo. El return no sirve de nada ya que la
función es un callback (no tiene a donde retornar). En cambio, la función lo
que hace es almacenar el nombre de archivo en el campo de texto "fe", el cual
es global y puede utilizarse para el procesamiento posterior.
> > def procesar():
> > """Procesa el archivo e inserta los resultados en los campos"""
> > global fe
> > global res
> > fname=fe.get()
>
> Acá debería ser usado el archivo abierto... pero (ver mas abajo)
Por lo expuesto mas arriba, lo que se tiene es el nombre del archivo en fname
ya que fe.get() devuelve el string en el campo de texto. Todavía no hay ningún
archivo abierto hasta acá.
> >
> > def hacerGUI():
> > global res
> > global fe
> >
> > fb=Button(ff,text="...", command=definir_archivo)
> Como acá es llamado no sé donde guardo el valor devuelto por
> definir_archivo()...
Nuevamente, esto no es un llamado a función ya que no tiene el () al final,
sino un callback pasado por nombre al botón. Cuando el botón es presionado
(que puede ser en cualquier momento de la vida del programa) lo que hace es
llamar a la función, ahora sí con ().
Acá hay que notar que si hubieras puesto "command=definir_archivo()", lo que
hubiera pasado es que la función se hubiera ejecutado, y el valor almacenado
en "command" hubiera sido el valor de retorno de la función, que al no tener
ninguno es None. Cuando presiones el botón, este va a intentar ejecutar None(),
con lo que estamos al horno ...
> Sería una solución definir un objeto global "archivo" y que sea visible por
> estas tres llamadas es decir:
>
> def definir_archivo():
> """Selecciona el archivo a procesar"""
> global fe
> global archivo
> fname = tkFileDialog.askopenfilename()
> if fname:
> fe.delete(0, END)
> fe.insert(0, fname)
> archivo=open(fname,'r')
> return
Esa es la función del campo fe, que es global. ¿Porque no usar un file object
o descriptor directamente? porque por la propia naturaleza de los programas GUI
este te permite correrlo varias veces con diferentes archivos, por lo que
habría problemas seguramente para decidir cuando abrirlo y cuando cerrarlo,
por lo que la mejor solución (IMHO) es abrirlo y cerrarlo al principio
y al final de la función procesar(), que se encarga del procesamiento de una
sola vez. Una solución mas "limpia", por asi decirlo
Emiliano
Más información sobre la lista de distribución Programacion