Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: AdeLax en 9 Agosto 2013, 20:09



Título: [Python/Tk]Mi Programa se ríe de mi
Publicado por: AdeLax en 9 Agosto 2013, 20:09
Hola buenas a todos!

Les traigo una cosa muy curiosa que me pasa, no se si es mi programa, la función 'os.listdir()' , un error, o soy estúpido...

Les traigo este script, que funciona para moverse entre carpetas de forma visual, esta en desarrollo, el programa, lista todos los archivos y carpetas, tu selecionas una carpeta, NO un archivo, y lista los archivos de esa carpeta, pero si lo vuelvo a hacer en otro directorio me da error!  :-[ :-[ :-[

Les traigo el script para que lo miren:

Código:
from Tkinter import *
import sys
import os
 
v0=Tk()
v0.geometry("1000x1000")
 
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 = os.listdir(os.getcwd())
 
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 funcion_milagro():                       
    ind = list1.curselection()
    if list1.curselection() != ():
        sel2 = list1.get(ind)
        print sel2                           #Todo esto funciona bien,

                                             #pero al segundo cambio de directorio                                                                                                 
        rut = os.getcwd() + '\\' + sel2
        #os.system('cd /d ' + rut)
        print rut
        print rut

        list1.delete(0, END)

        archis = os.listdir(rut)              # Me salta error como que no existe el directorio
                                              #funcionando bien a la primera
        print archis
           

        for imagen in archis:
            list1.insert(END,imagen)
       



       
b1=Button(v0,text="Siguiente", command = funcion_milagro, width=15).place(x=435, y=180)

 
cargarlistbox(ListaNombres,list1)
imprimir_en_label()
funcion_milagro()
 
v0.mainloop()

Guardenlo como .py para visualizar el error en consola

Es como que no existiese ese directorio, aparte e puesto un par de prints por si acaso era error de otra funcion o variable, pero no por lo que e visto es el listdir creo.

Ojala alguien me pueda dar una solución seria de mucho agrado  :D :D



Título: Re: [Python/Tk]Mi Programa se ríe de mi
Publicado por: Once en 11 Agosto 2013, 05:21
El problema es que estas trabajando sobre la ruta en la que está el script (os.getcwd()) así que lo que tienes sólo te sirve para las carpetas que esten al mismo nivel que el script.

Supon que en la raíz del disco C: tienes tu script y la carpeta "Nueva" y dentro de la carpeta "Nueva" tienes otra carpeta con el nombre: "Más nueva"

Cuando haces os.getcwd() te regresa c:/ si intentas entrar a "Nueva" la ruta te quedaria: C:/Nueva (no da errores, la carpeta existe) pero cuando intentas entrar a "Más nueva" la ruta te quedaria: C:/Más nueva (que no existe) la ruta verdadera seria: C:/Nueva/Más nueva

Y un par de sugerencias:

En lugar de usar:
Código
  1. rut = os.getcwd() + '\\' + sel2
usa os.path.join()
Código
  1. rut = os.path.join(os.getcwd(), sel2)

Declara primero las funciones y luego coloca el código principal

También puedes usar la función os.path.isdir() (http://docs.python.org/2/library/os.path.html#os.path.isdir) para que evites esos errores cuando no se selecciona un directorio.

Saludos!


Título: Re: [Python/Tk]Mi Programa se ríe de mi
Publicado por: AdeLax en 11 Agosto 2013, 12:19
Muchas gracias por la respuesta!  :D

Me ayudaste mucho