11 may. 2011

GtkBuilder, Glade y Python Parte 3

Si están leyendo esto es porque ya pasaron por el segundo tutorial del tema.

Con esta tercera entrega vamos a terminar de organizar algunos elementos de la interfaz gráfica que quedaron pendientes de la ultima vez y vamos a dejar todo listo para dedicar bastante tiempo a la programación en Python.

Lo primero sera crear unos Gtk.ListStore, lo podemos hacer como se ve en la imagen.

Vamos a crear dos de estos y los vamos a nombrar como aparece en la siguiente imagen y adicional mente les vamos a poner elementos gchararray como se ve en las dos siguientes figuras.


Finalmente al OrderList le vamos a agregar dos filas una con el nombre "Orden Aleatorio" y otra con "Orden Alfabetico" como se ve en la siguiente figura.

Una vez terminado esto lo único que nos falta para terminar la parte gráfica es asociar estos dos modelos con otros elementos de la interfaz gráfica, me imagino que ya suponen con cual, Medialist se va a asociar con el TreeView y OrderList se va a asociar con el Combobox que pusimos en la parte de abajo de la aplicación. Esto se hace de la siguiente forma:



Con esto hemos terminado todo lo que tenia que ver con la interfaz gráfica, puede ir a correrla para verificar que todo esta en orden y vamos con el código en Python ahora.

Lo primero que vamos a hacer es asociar los botones que están en la parte de arriba de izquierda a derecha.

El primero sera Añadir

Lo primero es que como ya definimos en el tutorial pasado algunas acciones para los botones estas deberíamos meterlas en un diccionario, en liblgade que ya esta extinto, esto se tenia que hacer de forma individual, con GtkBuilder no es necesario, por ahora vamos a ir agregando definiciones a nuestro diccionario de una en una, la primera sera asignar una acción a la señal on_Add_clicked. Los diccionarios en python se construyen con corchetes seguidos de una acción, en este caso es una acción propia que se llamara self.showAddFile, que básicamente lo que hará mas adelante es llamar el dialogo de abrir archivos que creamos en Glade en el tutorial pasado. Después simplemente conectamos la señal con el diccionario que hemos creado usando la instrucción builder.connect_signals(dict) eso es muy parecido a lo que hacíamos con libglade. 

#!/usr/bin/python from gi.repository import Gtk 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") # Diccionario de eventos y Conexion de los mismos. dict = {"on_Add_clicked": self.showAddFile, } builder.connect_signals(dict) #Ejecucion del programa if __name__ == "__main__": main() Gtk.main()


El código anterior no produce absolutamente nada mas que un error de definición porque no tenemos la definición de self.showAddFile
El siguiente paso es crear una definición propia para self.showAddFile

Las definiciones en python se crean con el comando def. En este caso vamos a crear una definición propia que aparte de eso recibe un widget, un widget es básicamente un elemento gráfico, este elemento gráfico le pondremos como nombre addfile y después lo vamos a llamar en otra parte del codigo.

#Definicion del comando Agregar def showAddFile(self, widget): self.addfile.run() self.addfile.hide()


Después de definido showAddfile hemos agregado un nuevo elemento que python no conoce y es self.addfile y al final hemos usado el comando run() para que este elemento se muestre y el comando hide() para que al presionar cancelar dentro de la ventana creada esta se esconda. Pero vamos a definir  self.addfile en la parte superior donde hemos llamado al builder, debe ser algo asi: self.addfile = builder.get_object("Add") esto basicamente lo que hace es buscar en el archivo .ui que es el de la interfaz gráfica un objeto que tiene el nombre Add, nuestro código completo quedara de la siguiente forma.

#!/usr/bin/python from gi.repository import Gtk 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") # Diccionario de eventos y Conexion de los mismos. dict = {"on_Add_clicked": self.showAddFile} builder.connect_signals(dict) #Definicion del comando Agregar def showAddFile(self, widget): self.addfile.run() self.addfile.hide() #Ejecucion del programa if __name__ == "__main__": main() Gtk.main()



Podemos proceder a correr el codigo que tenemos en este punto y ver los resultados. Al presionar el botón agregar aparece el dialogo de agregar archivos.

Vamos a repetir el mismo procedimiento para cada uno de los botones que tienen que desplegar ventanas nuevas, en este caso estamos hablando de acerca de, abrir carpeta y guardar.

Entonces lo primero es en el diccionario agregar los nuevos elementos

"on_AddFolder_clicked": self.showAddFolder,
"on_Saved_clicked": self.showSave,
"on_About_clicked": self.showAbout,


Después de agregados estos elementos buscamos los elementos del builder y los agregamos.

self.addfolder = builder.get_object("AddFolder")
self.save = builder.get_object("Save")
self.about = builder.get_object("About")

Y los definimos igual que lo hicimos con agregar. Vamos a hacer una modificación en la definición de acerca de, esto se debe a que este widget no debe recibir ningún tipo de datos. Los demás si queremos que reciban datos, por eso después de widget agregamos data = None. Nuestro archivo final va a quedar de la siguiente forma.

#!/usr/bin/python from gi.repository import Gtk 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") # 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.addfile.run() self.addfile.hide() #Definicion del comando Abrir Carpeta def showAddFolder(self, widget): self.addfolder.run() self.addfolder.hide() #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()


Con esto hemos concluido por hoy, pero espere en unas horas la siguiente parte.

No hay comentarios:

Publicar un comentario en la entrada