Explorador de archivos y carpetas

Versión: 2.x.
Descargas: explorer_src.zip.

Un simple programa que permite explorar tus documentos en todas las plataformas, utilizando las funciones estándar de operaciones con archivos y carpetas junto con la librería PyQt 4, utilizada para el desarrollo de la interfaz gráfica, y el módulo hurry.filesize, para proveer tamaños de archivos más agradables.

Vista previa

Ubuntu
Vista previa (Linux)

Windows
Vista previa (Windows)

Código de fuente

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from os import getcwd, listdir, stat
from os.path import dirname, isdir, isfile, join
from time import localtime, strftime

try:
    # Windows.
    from os import startfile
except ImportError:
    # Otras plataformas.
    from webbrowser import open as startfile

from hurry.filesize import size
from PyQt4.QtCore import QStringList
from PyQt4.QtGui import (QApplication, QHBoxLayout, QIcon, QMainWindow,
                         QLineEdit, QPushButton, QTreeWidget,
                         QTreeWidgetItem, QVBoxLayout, QWidget)


class Window(QMainWindow):
    
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("Explorador de archivos y carpetas")
        
        self.back_history = []
        self.forward_history = []
        
        self.back_button = QPushButton(self)
        self.back_button.setIcon(QIcon("images/back.png"))
        self.back_button.clicked.connect(self.back_clicked)
        self.back_button.setEnabled(False)
        
        self.forward_button = QPushButton(self)
        self.forward_button.setIcon(QIcon("images/forward.png"))
        self.forward_button.clicked.connect(self.forward_clicked)
        self.forward_button.setEnabled(False)
        
        self.up_button = QPushButton(self)
        self.up_button.setIcon(QIcon("images/up.png"))
        self.up_button.clicked.connect(self.up_button_clicked)
        
        self.address_edit = QLineEdit(self)
        
        self.refresh_button = QPushButton(self)
        self.refresh_button.setIcon(QIcon("images/update.png"))
        self.refresh_button.clicked.connect(self.refresh_button_clicked)
        
        self.toplayout = QHBoxLayout()
        self.toplayout.addWidget(self.back_button)
        self.toplayout.addWidget(self.forward_button)
        self.toplayout.addWidget(self.up_button)
        self.toplayout.addWidget(self.address_edit)
        self.toplayout.addWidget(self.refresh_button)
        
        self.main_tree = QTreeWidget(self)
        self.main_tree.setRootIsDecorated(False)
        self.main_tree.setHeaderLabels(
            ("Nombre", u"Fecha de modificación", u"Tamaño"))
        self.main_tree.itemDoubleClicked.connect(self.item_double_clicked)
        
        self.layout = QVBoxLayout()
        self.layout.addLayout(self.toplayout)
        self.layout.addWidget(self.main_tree)
        
        self.central_widget = QWidget(self)
        self.central_widget.setLayout(self.layout)
        self.setCentralWidget(self.central_widget)
        
        self.resize(800, 600)
        # Iniciar en el directorio actual.
        self.load_path(getcwd())
    
    def back_clicked(self, checked):
        if self.back_history and len(self.back_history) > 1:
            # Obtener el último elemento.
            path = self.back_history[-2]
            self.forward_history.append(self.back_history[-1])
            # Remover el directorio actual.
            del self.back_history[-1]
            self.load_path(path, False)
    
    def forward_clicked(self, checked):
        if self.forward_history:
            path = self.forward_history[-1]
            self.back_history.append(path)
            del self.forward_history[-1]
            self.load_path(path, False)
    
    def item_double_clicked(self, item, column):
        filepath = join(self.current_path, unicode(item.text(0)))
        if isdir(filepath):
            self.load_path(filepath)
        else:
            # Iniciar archivo con el programa predeterminado.
            startfile(filepath)
    
    def up_button_clicked(self, checked):
        parent = dirname(self.current_path)
        if parent != self.current_path:
            self.load_path(parent)
    
    def load_path(self, path, use_history=True):
        # Obtener archivos y carpetas.
        items = listdir(unicode(path))
        # Eliminar el contenido anterior.
        self.main_tree.clear()
        
        for i in items:
            # Omitir archivos ocultos.
            if i.startswith("."):
                continue
            filepath = join(path, i)
            # Obtener informacion del archivo.
            stats = stat(filepath)
            # Crear el control ítem.
            item_widget = QTreeWidgetItem(
                (i, strftime("%c", localtime(stats.st_mtime)).decode("utf-8"),
                 size(stats.st_size) if isfile(filepath) else "")
            )
            # Establecer el ícono correspondiente.
            item_widget.setIcon(0, QIcon("images/%s.png" %
                ("file" if isfile(filepath) else "folder")))
            # Añadir elemento.
            self.main_tree.addTopLevelItem(item_widget)
        
        # Ajustar el tamaño de las columnas.
        for i in range(3):
            self.main_tree.resizeColumnToContents(i)
        
        self.current_path = path
        self.address_edit.setText(self.current_path)
        
        # Añadir al historial.
        if use_history:
            self.back_history.append(self.current_path)
        
        # Habilitar / dehabilitar botones del historial.
        if self.back_history and len(self.back_history) > 1:
            if not self.back_button.isEnabled():
                self.back_button.setEnabled(True)
        else:
            if self.back_button.isEnabled():
                self.forward_history = []
                self.back_button.setEnabled(False)
        
        if self.forward_history:
            if not self.forward_button.isEnabled():
                self.forward_button.setEnabled(True)
        else:
            if self.forward_button.isEnabled():
                self.forward_button.setEnabled(False)
    
    def refresh_button_clicked(self, checked):
        self.load_path(self.current_path)


if __name__ == "__main__":
    app = QApplication([])
    window = Window()
    window.show()
    sys.exit(app.exec_())

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

Deja una respuesta