[Python] Cliente Ftp Tkinter

Iniciado por Runex, 15 Abril 2012, 00:16 AM

0 Miembros y 1 Visitante están viendo este tema.

Runex

Buenas compañeros, me ha dado por aplicarle interfaz a un viejo programa que cree, un cliente ftp.
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 (python) [Seleccionar]
#!/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 :)
"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".

0x5d

No tengo windows para probarlo :/ podrías dejar un screenshot ?
¡ SIGUEME EN TWITTER -> @JavierEsteban__ !

Runex

No si yo lo corro en ubuntu :), no hace falta windows para nada, tkinter es un módulo standar  ;-)

De todas formas aquí te dejo un screen:

"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".

0x5d

Cita de: Runex en 16 Abril 2012, 19:13 PM
No si yo lo corro en ubuntu :), no hace falta windows para nada, tkinter es un módulo standar  ;-)

De todas formas aquí te dejo un screen:


Jajaja yo uso Debian 6 y no me deja correrlo ! :P
¡ SIGUEME EN TWITTER -> @JavierEsteban__ !

Runex

Cita de: 0x5d en 18 Abril 2012, 04:48 AM
Jajaja yo uso Debian 6 y no me deja correrlo ! :P

Pues raro es, lo he probado en opensuse y en la misma versión de debian que tu y si me funciona XD

Un saludo :)
"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".