6 feb. 2012

Crear Elementos Aleatorios en GtkTreeview

Si han revisado el blog y están haciendo el Tutorial de Python y GTK3 se habrán dado cuenta que en GTK3 no existe order(index) para el Treeview. Esto permitía reordenar una lista, pero en GTK3 no existe y por lo tanto elimina la opción de crear una lista aleatoria con facilidad.

Más información.

Es por ello que para GTK3 hay que implementar un método distinto para poder solucionar este pequeño problema que deja el paso de GTK2 a GTK3.

El usuario Gustavo Angel me ha pedido amablemente buscar una solución y me he puesto a pensar de una forma relativamente eficiente de realizar esto sin comprometer demasiado el código tratando de que el nuevo código sea compatible para GTK2 y GTK3


Código ANTIGUO únicamente valido para GTK2
     #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 llamada medialist
             if len(index) > 1:
                 self.medialist.reorder(index)

Código NUEVO valido para GTK2 y GKT3
    #Nuevo sistema de aleatorio
    def aleatorio(self, widget, data=None):
        lista = []
        for allfiles in self.liststore1:
            for media_files in allfiles:
                lista.append(media_files)
        random.shuffle(lista)
        self.liststore1.clear()
        for f in lista:
            self.liststore1.append([f])

Este código nuevo no esta aplicado al programa del tutorial es solo un ejemplo que he creado para un programa sencillo que importa archivos de audio, crea una lista Treeview y después se encarga de volver la lista aleatoria.

Dejo el link de descarga del programa para que lo miren y lo prueben y si alguien tiene una mejor idea de como crear el Aleatorio nos deje el comentario.



Pronto actualizare el tutorial en PDF con el nuevo código aleatorio para gtk2 y gtk3

Actualización 12 de Febrero 2012: Al parecer este método solo es útil cuando se tiene una sola columna en el Gtk.liststore por lo que aunque es una forma valida de realizar el proceso es incompleta cuando se tienen mas columnas, seguiré buscando una solución mas completa para solucionar este problema.

Actualización 13 de Febrero 2012: Después de dedicar casi todo mi domingo a romperme la cabeza para solucionar este pequeño dolor de cabeza que son los Treeviews he encontrado una nueva solución mas general de la que comento en esta entrada. Esta nueva solución esta lejos de ser perfecta y para mi es mas bien un Hack que soluciona el problema pero hace que el código se vea algo maluco.

Dejo sin embargo la información en miras de si alguien encuentra una solución mas completa y bonita la pueda colocar en los comentarios y así actualizare esta entrada.

Este nuevo código asume que son dos listas o dos columnas con las que trabajamos por lo tanto asume también que ya no se trabaja con un solo gtk.liststore pero con dos para el caso de dos columnas. Si fueran 3 columnas entonces tocaría agregar una lista3 y un self.liststore3.

    def aleatorio(self, widget, data=None):
        lista1 = []
        lista2 = []
        for files in self.liststore1:
            for a in files:
                lista1.append(a)
        for uri in self.liststore2:
            for b in uri:
                lista2.append(b)
        listas = zip(lista1,lista2)
        random.shuffle(listas)
        u = [x[0] for x in listas]
        v = [x[1] for x in listas]
        self.liststore1.clear()
        self.liststore2.clear()
        for f in u:
            self.liststore1.append([f])   
        for f in v:
            self.liststore2.append([f])

Si encuentro una nueva solución que evite el uso continuo de tantos for y el zip, actualizare esta entrada. Por ahora se me ocurren opciones pero solo podre revisar hasta el sábado que tenga suficiente tiempo.

No hay comentarios:

Publicar un comentario