11 may. 2011

GtkBuilder y Python Parte 4

Si estas mirando esta cuarta entrega es porque de alguna forma ya leíste las anteriores

Aprendiendo GtkBuilder y Python Parte 1

GtkBuilder, Glade y Python Parte 2

GtkBuilder, Glade y Python Parte 3


Como ya pudieron notar en el tutorial 3 entramos ya en el terreno de python y ahora ya no lo vamos a abandonar hasta que terminemos de construir nuestra aplicación, en esta nueva entrada lo que vamos es a refinar algunas cosas de lo que tenemos.

Lo primero que les voy a enseñar es a manejar archivos en python, hasta el momento solo podemos invocar  la ventana que muestra el selector de archivos pero como pueden notar esto no hace absolutamente nada cuando presionamos doble click sobre un archivo. Lo primero que queremos hacer es permitirle al botón abrir hacer alguna cosa, en este caso simplemente le vamos a dar la habilidad de obtener el nombre de los archivos que se seleccionen, esto se hace con el comando get_filenames() que lo que hace es obtener los nombres de los archivos seleccionados por la interfaz self.addfile. Se acuerdan que al botón cerrar y aceptar le pusimos un id de -6 y -5 respectivamente. Bueno el -6 por defecto siempre es cerrar y el -5 implica una respuesta positiva, por eso usamos un if que simplemente hace algo si la respuesta es -5.
#Definicion del comando Agregar def showAddFile(self, widget): respt = self.addfile.run() self.addfile.hide() if respt == -5: fileselected = self.addfile.get_filenames() print fileselected


En este caso si la respuesta del botón es afirmativa (-5) entonces en la variable fileselected va a guardar los nombres de los mismos y los va a imprimir en el terminal con el comando print, mas adelante vamos a mejorar esto importando algunos módulos de python pero por ahora vamos a dejar esta parte así.

Como muchos de ustedes han  notado la mayoría de diálogos de abrir tienen un filtro en la parte de abajo, como se ve en la imagen justo arriba del boton de abrir donde dice Media Files.

Vamos a crear este filtro para nuestra aplicacion, este tipo de filtros se llama Gtk.FileFilter() y lo ideal seria que lo invocáramos debajo de los builders para poder usarlo varias veces en la ventana de abrir carpeta y en la de guardar. Lo invocamos con self.filterbox = Gtk.FileFilter() como se ve en la linea 8

def __init__(self): # Crea la ventana de trabajo Principal y obtiene los objetos en Glade builder = Gtk.Builder() builder.add_from_file("Multiplay.ui") self.addfile = builder.get_object("Add") self.addfolder = builder.get_object("AddFolder") self.save = builder.get_object("Save") self.about = builder.get_object("About") self.filterbox = Gtk.FileFilter()


Con esto listo volvemos a trabajar, para ello vamos a crear una tupla, que es básicamente una lista que contiene dos elementos en forma de columna, a esta tupla le vamos a poner el nombre filepattern o en español seria algo como patronesdearchivo  y lo vamos a ubicar justo antes de la clase main. La primera columna contiene el nombre (name) de los archivos MP3, AVI y la segunda contiene el patron de los archivos (pattern) *.mp3, *.avi

#!/usr/bin/python from gi.repository import Gtk filepattern = ( ("MP3","*.mp3"), ("AVI","*.avi"), ("MPEG-4","*.mp4"), ("FLV ","*.flv"), ("OGG","*.ogg"), ) class main:

Una vez creada esta tupla vamos a continuar trabajando en el dialogo de abrir archivos, para cada elemento en la tupla vamos a crear dos nuevas variables una de nombre Name y la otra de nombre Pattern y todo esto es posible porque usamos un for name, pattern in filepattern: Esto permite iterar sobre la tupla y el comando self.filterbox.add_pattern(pattern) lo que hace es crear el patrón en el filtro. El comando self.addfile.add_filter(self.filterbox) lo que hace es agregar el filtro a la base de nuestro dialogo de abrir archivos, cada vez que creamos un filtro al cerrar la aplicación debemos eliminarlo por eso en la linea 10 agregamos el comando self.addfile.remove_filter(self.filterbox) que lo que hace es eliminar el filtro al cerrar el dialogo.


#Definicion del comando Agregar def showAddFile(self, widget): self.filterbox.set_name("Media Files") for name, pattern in filepattern: self.filterbox.add_pattern(pattern) self.addfile.add_filter(self.filterbox) respt = self.addfile.run() self.addfile.remove_filter(self.filterbox) self.addfile.hide() if respt == -5: fileselected = self.addfile.get_filenames() print fileselected



Hacemos el mismo procedimiento para abrir carpetas y al final nuestro programa queda de la siguiente forma. Por ahora hemos terminado la parte 4 que trataba de mejorar los diálogos de abrir archivos

#!/usr/bin/python from gi.repository import Gtk filepattern = ( ("MP3","*.mp3"), ("AVI","*.avi"), ("MPEG-4","*.mp4"), ("FLV ","*.flv"), ("OGG","*.ogg"), ) class main: def __init__(self): # Crea la ventana de trabajo Principal y obtiene los objetos en Glade builder = Gtk.Builder() builder.add_from_file("Multiplay.ui") self.addfile = builder.get_object("Add") self.addfolder = builder.get_object("AddFolder") self.save = builder.get_object("Save") self.about = builder.get_object("About") self.filterbox = Gtk.FileFilter() # Diccionario de eventos y Conexion de los mismos. dict = {"on_Add_clicked": self.showAddFile, "on_AddFolder_clicked": self.showAddFolder, "on_Saved_clicked": self.showSave, "on_About_clicked": self.showAbout, } builder.connect_signals(dict) #Definicion del comando Agregar def showAddFile(self, widget): self.filterbox.set_name("Media Files") for name, pattern in filepattern: self.filterbox.add_pattern(pattern) self.addfile.add_filter(self.filterbox) respt = self.addfile.run() self.addfile.remove_filter(self.filterbox) self.addfile.hide() if respt == -5: fileselected = self.addfile.get_filenames() print fileselected #Definicion del comando Abrir Carpeta def showAddFolder(self, widget): self.filterbox.set_name("All Media Files") for names, patterns in filepattern: self.filterbox.add_pattern(patterns) self.addfolder.add_filter(self.filterbox) respt = self.addfolder.run() self.addfolder.remove_filter(self.filterbox) self.addfolder.hide() if respt == -5: addmultiple = self.addfolder.get_filename() #Definicion del comando Guardar Permite guardar una lista def showSave(self, widget): self.save.run() self.save.hide() #Definicion del Comando Acerca de: def showAbout(self, widget, data=None): self.about.run() self.about.hide() #Ejecucion del programa if __name__ == "__main__": main() Gtk.main()

No hay comentarios:

Publicar un comentario