martes, 30 de junio de 2015

10 - Python PyQt (Interfaz gráfica) - Tree Widget (Árbol de datos)




En este capítulo del tutorial de Python 3 con PyQt5 veremos como crear árboles de datos con el objeto Tree Widget. Este objeto nos permite crear estructuras de forma ordenada a través de columnas y filas con sus respectivos items.

Como ejemplo veremos como listar los elementos de un directorio, emulando al arbol de datos que podemos encontrar al abrir una carpeta, ordenados por las columnas Nombre, Fecha modificación, Tipo y Tamaño.

Crearemos un archivo ui con Designer llamado treewidget.ui

Crearemos un cuadro de diálogo que lo convertiremos en un contenedor (Lay Out in a Grid) y agregaremos un objeto Tree Widget al cual llamaremos directorio y tendrá cuatro columnas: Nombre | Fecha modificación | Tipo | Tamaño

Agregaremos un objeto Label con el texto "Buscar directorio:"

Agregaremos un objeto Line Edit con nombre ruta

Y por último agregaremos un objeto Push Button con nombre boton y el texto "Buscar"

treewidget.pyw


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

class Dialogo(QDialog):
 def __init__(self):
  QDialog.__init__(self)
  uic.loadUi("treewidget.ui", self)
  self.boton.clicked.connect(self.getDir)
  
 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)])
  
app = QApplication(sys.argv)
dialogo = Dialogo()
dialogo.show()
app.exec_()



1 comentario:

Rafael Hidalgo Barbudo dijo...

Buenas, ante todo decir que es muy buen aporte, muy bien explicado. Ahora tengo una duda, en el siguiente post se ve claro como acceder al contenido de una columna, si por ejemplo yo ahora quisiera acceder a una fila especifica, como lo se realizaria? No hago nada mas que mirar la documentación y no lo encuentro. Es decir, que me imprima el contenido de la fila 3 y de la columna 2 por ejemplo.

Gracias de antemano.
Un saludo