Aún le faltan algunas cosas como una opción para retroceder de directorio y otra para subir archivos. Algún día de estos lo añadiré que me voy a la cama .
Os recomiendo que lo guardéis en .pyw así no se ejecuta por detrás la ventana de comandos.
EDIT: Le he añadido nuevas opciones, la posibilidad de abrir nuevas más clientes en diferentes ventanas, guardar registros de tus movimientos en un txt, subir archivos y cerrar la conexión limpiando directorios y archivos, ahora cuando tenga tiempo le añado, la de retroceder, renombrar y eliminar, y con eso finalizaré .
EDIT2: Bueno ya le he añadido las opciones que le faltaban y en mi opinión ya está terminado. Si encontráis algún bug, reportadmelo y lo corrijo gustosamente
Os dejo el código:
Código
#!/usr/bin/env python # -*- coding: utf-8 -*- #Copyright 2012 jose <jose@jose-desktop> from Tkinter import * import ftplib,tkMessageBox class Ftp_Client: def __init__(self,root): self.root = root self.root.title("ClientFtp") self.top=Menu(self.root) self.root.config(menu=self.top) self.file = Menu(self.top) self.about = Menu(self.top) self.about.add_command(label="Sobre mi",command=self.informacion,underline=0) self.file.add_command(label="Abrir nueva ventana",command=self.ventana_x,underline=0) self.file.add_command(label="Cerrar conexion",command=self.close_conection,underline=0) self.file.add_command(label="Registro en txt",command=self.guardar_txt,underline=0) self.top.add_cascade(label="File",menu=self.file) self.top.add_cascade(label="About",menu=self.about) self.root.configure(bg="black") self.root.maxsize("700","550") self.root.minsize("700","550") self.url = StringVar() self.listadescarga = [] self.listasubida = [] self.listaeliminados = [] self.listanombres = [] self.listarenombres = [] self.directorio = StringVar() Label(self.root,fg="green",bg="black",text="Introduce tu servidor Ftp",justify="center",font=("Helvetica",18)).grid(padx=200) self.entrada = Entry(self.root,width="40",textvariable=self.url) self.entrada.grid(pady=15) self.conectar = Button(self.root,text="Conectar",command=self.conect_Ftp) self.conectar.grid(pady=15) Label(self.root,fg="green",bg="black",text="Directorios",font=("Helvetica",16)).grid(pady=15) self.listbox = Listbox(self.root,width="60") self.listbox.grid(row=4,column=0) self.directorios = Entry(self.root,textvariable=self.directorio,width="30") self.directorios.grid(pady=15) self.download = Button(self.root,text="Download",command=self.panel_descarga) self.download.grid(row=7) self.delete = Button(self.root,text="Eliminar",command=self.eliminar) self.delete.grid(row=7,padx=465,columnspan=500) self.avanzar = Button(self.root,text="Avanzar",command=self.avanzar) self.avanzar.grid(row=6,column=0,padx=380,columnspan=270) self.renombrar = Button(self.root,text="Rename",command=self.rename) self.renombrar.grid(row=6,padx=380,columnspan=750) self.retroceder = Button(self.root,text="Retroceder",command=self.retroceder) self.retroceder.grid(row=6,pady=10) self.upload = Button(self.root,text="Upload",command=self.panel_subida) self.upload.grid(row=7,column=0,padx=290,columnspan=260) def conect_Ftp(self): try: self.conectftp = ftplib.FTP(self.entrada.get()) self.window = Tk() self.window.maxsize("300","280") self.window.minsize("300","280") self.window.title("Conectar Con Servidor") self.window.configure(bg="black") Label(self.window,fg="green",bg="black",text="Panel de Logueo",font=("Helvetica",15)).grid(padx=70) self.user = StringVar() self.password = StringVar() Label(self.window,fg="green",bg="black",text="Usuario").grid(pady=10) self.usuario = Entry(self.window,width="20",textvariable=self.user) self.usuario.grid(pady=10) Label(self.window,fg="green",bg="black",text="Password").grid(pady=10) self.enpassword = Entry(self.window,width="20",textvariable=self.password) self.enpassword.grid(pady=10) self.logueo = Button(self.window,text="Loguear",command=self.log_Ftp) self.logueo.grid(pady=15) self.window.mainloop() except: tkMessageBox.showinfo("Error","No existe el servidor") def log_Ftp(self): try: self.conectftp.login(self.usuario.get(),self.enpassword.get()) self.datos = [self.usuario.get(),self.enpassword.get()] self.window.destroy() self.listar_directorios() except: tkMessageBox.showinfo("Error","User y Pass Incorrectos") def listar_directorios(self): self.listbox.delete(0,END) self.listadir = [] self.listbox.insert(END,"----Directorios----") for self.directorio in self.conectftp.nlst(): self.listbox.insert(END,self.directorio) self.listadir.append(self.directorio) def avanzar(self): try: self.conectftp.cwd(self.directorios.get()) self.listar_directorios() except: tkMessageBox.showinfo("Error","No existe el directorio") def panel_descarga(self): self.paneldescarga = Tk() self.paneldescarga.maxsize("300","200") self.paneldescarga.minsize("300","200") self.paneldescarga.title("Download") self.paneldescarga.configure(bg="black") Label(self.paneldescarga,text="Introduce el nombre para guardar el archivo",bg="black",fg="green").grid(pady=10) self.nombre = StringVar() self.nombreguardado = Entry(self.paneldescarga,textvariable=self.nombre) self.nombreguardado.grid(pady=10) self.guardar = Button(self.paneldescarga,text="Guardar",command=self.descarga) self.guardar.grid(pady=10) self.paneldescarga.mainloop() def descarga(self): try: self.listadescarga.append(self.directorios.get()) self.archivolocal = open(self.nombreguardado.get(),'wb') except: tkMessageBox.showinfo("Error","No se ha podido guardar el archivo") self.paneldescarga.destroy() try: self.conectftp.retrbinary('RETR '+self.directorios.get(),self.archivolocal.write) self.paneldescarga.destroy() except: tkMessageBox.showinfo("Error","No existe el archivo") def informacion(self): tkMessageBox.showinfo("Sobre Mi","ClienteFtp 1.0 By Rune, alumno de 2 bachiller en el centro EPLA de valencia") def ventana_x(self): self.root2 = Tk() self.instancia = ventana_2(self.root2) def guardar_txt(self): try: self.archivodatos = open("Backup"+self.entrada.get()+".txt","a") self.archivodatos.write("-------------------------------------------\n") self.archivodatos.write("Conexion con: "+self.entrada.get()+"\n") self.archivodatos.write("Usuario--->" +self.datos[0] +"\n") self.archivodatos.write("Password--->" + self.datos[1] + "\n") self.archivodatos.write("---Directorios Visualizados Del Servidor---\n") for self.direct in self.listadir: self.archivodatos.write(self.direct+"\n") self.archivodatos.write("\n---Archivos Descargados---\n") for self.archiv in self.listadescarga: self.archivodatos.write(self.archiv + "\n") self.archivodatos.write("\n---Archivos Subidos---\n") for self.archivo in self.listasubida: self.archivodatos.write(self.archivo + "\n") self.archivodatos.write("\n---Archivos Renombrados---\n") for self.nombre in self.listanombres: self.archivodatos.write(self.nombre) for self.renombre in self.listarenombres: self.archivodatos.write("----->"+self.renombre+"\n") self.archivodatos.write("\n---Archivos Eliminados---\n") for self.eliminado in self.listaeliminados: self.archivodatos.write(self.eliminado) self.archivodatos.close() except: tkMessageBox.showinfo("Error","Compruebe que ha inicializado alguna conexion") def panel_subida(self): self.panelsubida = Tk() self.panelsubida.maxsize("350","200") self.panelsubida.minsize("350","200") self.panelsubida.title("Upload") self.panelsubida.configure(bg="black") Label(self.panelsubida,text="Introduce el nombre del archivo junto con su directorio",bg="black",fg="green").grid(pady=10) self.nombrex = StringVar() self.nombrex2 = StringVar() self.nombreguardados = Entry(self.panelsubida,textvariable=self.nombrex) self.nombreguardados.grid(pady=10) Label(self.panelsubida,text="Introduce el nombre para guardar el archivo",bg="black",fg="green").grid(pady=10) self.nombresubir = Entry(self.panelsubida,textvariable=self.nombrex2) self.nombresubir.grid(pady=10) self.subir = Button(self.panelsubida,text="Subir",command=self.subida) self.subir.grid(pady=10) self.panelsubida.mainloop() def subida(self): try: self.archivo_origen = open(self.nombreguardados.get(),"rb") except: tkMessageBox.showinfo("Error","El archivo no existe") try: self.conectftp.storbinary('STOR ' + self.nombresubir.get(),self.archivo_origen) self.listar_directorios() except: tkMessageBox.showinfo("Error","No se ha podido subir el archivo") self.listasubida.append(self.nombreguardados.get()) self.panelsubida.destroy() def close_conection(self): try: self.conectftp.close() self.listbox.delete(0,END) except: tkMessageBox.showinfo("Error","Compruebe que ha inicializado una conexion") def retroceder(self): try: self.conectftp.cwd("..") self.listar_directorios() except: tkMessageBox.showinfo("Error","Compruebe que ha inicializado una conexion") def rename(self): self.window_rename = Tk() self.window_rename.configure(bg="black") self.window_rename.title("Rename") Label(self.window_rename,text="Introduce el nombre para renombrar",bg="black",fg="green").grid() self.renombre = StringVar() self.renombrar = Entry(self.window_rename,textvariable=self.renombre) self.renombrar.grid() self.acept = Button(self.window_rename,text="Renombrar",command=self.ejec_rename) self.acept.grid() def ejec_rename(self): self.fromname = self.directorios.get() self.toname = self.renombrar.get() try: self.conectftp.rename(self.fromname,self.toname) self.listanombres.append(self.fromname) self.listarenombres.append(self.toname) self.listar_directorios() except: tkMessageBox.showinfo("Error","No existe el archivo") self.window_rename.destroy() def eliminar(self): try: self.conectftp.delete(self.directorios.get()) self.listaeliminados.append(self.directorios.get()) self.listar_directorios() except: tkMessageBox.showinfo("Error","No existe el archivo") class ventana_2(Ftp_Client): pass if __name__ == "__main__": root = Tk() instance = Ftp_Client(root) root.mainloop()
Un saludo