martes, 30 de junio de 2015

11 - Python PyQt (Interfaz gráfica) - Tree Widget Signals (Acceso y control de datos)




Este capítulo del tutorial de Python 3 más PyQt5 es la continuación del capítulo anterior, en el cual vimos como agregar filas al un objeto Tree Widget, concretamente listando directorios. 

En este capítulo agregaremos un nuevo método a la clase llamado getElement, que nos permitirá navegar a un directorio o abrir un archivo con su programa por defecto, todo ello tras hacer doble click (itemDoubleClicked Signal) sobre el elemento. 

Más información sobre la clase QTreeWidget: http://pyqt.sourceforge.net/Docs/PyQt4/qtreewidget.html




treewidget.pyw


import sys, time
from PyQt5.QtWidgets import QApplication, QDialog, QTreeWidgetItem
from PyQt5 import uic
from os import listdir, path, stat, startfile
from mimetypes import MimeTypes

class Dialogo(QDialog):
 def __init__(self):
  QDialog.__init__(self)
  uic.loadUi("treewidget.ui", self)
  self.boton.clicked.connect(self.getDir)
  self.directorio.itemDoubleClicked.connect(self.openElement)
  
 def getDir(self):
  #Eliminar todas las filas de la búsqueda anterior
  self.directorio.clear()
  #Ruta indicada por el usuario
  dir = self.ruta.text()
  #Si es un directorio
  if path.isdir(dir):
   #Recorrer sus elementos
   for element in listdir(dir):
    name = element
    pathinfo = dir + "\\" + name
    informacion = stat(pathinfo)
    #Si es un directorio
    if path.isdir(pathinfo):
     type = "Carpeta de archivos"
     size = ""
    else:
     mime = MimeTypes()
     type = mime.guess_type(pathinfo)[0]
     size = str(informacion.st_size) + " bytes"
    #Fecha de modificación
    date = str(time.ctime(informacion.st_mtime))
    #Crear un array para crear la fila con los items
    row = [name, date, type, size]
    #Insertar la fila
    self.directorio.insertTopLevelItems(0, [QTreeWidgetItem(self.directorio, row)])
 def openElement(self):
  #Obtener el item seleccionado por el usuario
  item = self.directorio.currentItem()
  #Crear la ruta accediendo al nombre del elemento (carpeta o archivo)
  elemento = self.ruta.text() + "\\" + item.text(0)
  #Si es un directorio navegar a su interior
  if path.isdir(elemento):
   self.ruta.setText(elemento)
   self.getDir()
  else: #Si es un archivo abrirlo con el programa que lo abre por defecto en Windows
   startfile(elemento)
  
app = QApplication(sys.argv)
dialogo = Dialogo()
dialogo.show()
app.exec_()