30 jun. 2011

GtkBuilder y Python Parte 7


Si ya vas en la parte 7 es bueno que mires las anteriores

Aprendiendo GtkBuilder y Python Parte 1

GtkBuilder, Glade y Python Parte 2

GtkBuilder, Glade y Python Parte 3


Es hora de una nueva entrega, se que vamos rápido con esto pero si hay dudas pueden preguntar. La idea es terminar de publicar estos tutoriales para comenzar a programar algunas cosas nuevas que me gustaría enseñarles, pero todo con calma. Vamos a terminar esto y lo vamos a hacer bien.

En esta corta entrada vamos a configurar el Combobox
Y vamos a entender como se puede hacer Orden Aleatorio y Orden Alfabético en Python.

La verdad esto es bastante simple pero tendremos que volver un momentito a glade a realizar algo que olvidamos antes y es crear una señal cuando el combobox cambie.
Después de realizado esto en Glade podemos volver de nuevo sobre el codigo en Python.

Lo primero sera agregar al builder el OrderList que habíamos creado en glade.

self.combolist = builder.get_object("combobox1")

Lo segundo sera agregar al diccionario la señal que creamos en glade.

"on_ComboOrder_changed": self.newList,

Después vamos a crear la definición newList, que sera la encargada de hacer los cambios cuando se seleccione alguna de las opciones del combobox.
Explico entonces el código.

La linea 3 define una variable de nombre var que básicamente sera un valor numérico que se obtiene de la lista dentro del combobox si se selecciona el primer elemento del combobox este tendrá un numero 0 si se selecciona el segundo tendrá un valor de 1 y así para demás opciones. Esto se hace con que get_active(). Si el valor de var es igual a 0 quiere decir que se selecciono la opción Aleatorio.

Lo primero que se hace es crear una variable contadora n que arranca en 0 y entonces se itera sobre cada uno de los elementos dentro del Medialist. Si hay 20 canciones entonces itera de una en una sobre las 20, al final el contador n mostrara 19 elementos. Con estos elementos se crea un indice o una lista, como le quieran decir, esta arranca en 0 y termina en 19 para este ejemplo, eso es posible gracias al comando range().

La linea 19 dice shuffle(index) bueno shuffle es un modulo de python que simplemente podemos importarlo, este modulo crea valores aleatorios basados en una lista. Agregamos entonces en la parte superior el modulo ramdon y de este importamos shuffle.

from random import shuffle

Con eso hemos terminado de crear un nuevo listado aleatorio, si el largo o len() de la lista index es mayor que 1 entonces si aplica el comando reorder() que es un comando de Gtk que permite reordenar una Gtk.Liststore basado en un nuevo orden.

#Definicion para ordernar la lista def newList(self, widget): var = self.combolist.get_active() #Si se activa Aleatorio if var == 0: n = 0 for musicfiles in self.medialist: n += 1 index = range(0, n) shuffle(index) #Reorganiza la lista de musica llamad medialist if len(index) > 1: self.medialist.reorder(index) #Si se activa Alfabetico if var == 1: iter=self.medialist.get_iter_first() newlistfiles = [] while iter: files = self.medialist.get_value(iter,0) source = self.medialist.get_value(iter,1) newlistfiles.append([files,source]) iter = self.medialist.iter_next(iter) newlistfiles = sorted(newlistfiles) self.medialist.clear() for files,source in newlistfiles: self.medialist.append([files,source])

Ahora si var es igual a 1 estamos hablando de alfabético, para ello tenemos que iterar sobre todos los elementos de la lista y tenemos que exportar los nombres de las canciones y guardarlos en una variable. La linea 18 se para en el Gtk.Treeview y obtiene el primero elemento con el comando get_iter_first(), este comando es parecido a get_iter_root() que obtiene el primer elemento del treeview y obtiene la ruta hasta este, recuerden que get_iter_root() ya no existen en Gtk3 pero si esta presente en Gtk2 por si lo requieren.

La linea 19 crea una variable vacía.
Mientras se itera sobre cada uno de los elementos de la lista va a obtener el nombre de los archivos que están en la columna 0 y los guardara en la variable files, esto mismo para la ruta de los archivos pero la guardara en la variable source y finalmente con el comando append() vamos a unir el nombre y la ruta y quedaran guardados en newlistfiles.
La linea 24 simplemente pasa al siguiente iter y como están dentro de un while pues el proceso se hace hasta la ultima linea.
Después de realizado este procedimiento se utiliza el comando sorted() que básicamente es una función de python que organiza los elementos de una lista de forma alfabética, para terminar borramos toda la lista que tenemos en nuestro Treeview y metemos la nueva con el comando append([files,source]) y hemos terminado de organizar nuestra lista de forma alfabética.

Espere pronto el tutorial 8.

No hay comentarios:

Publicar un comentario