Pour voir le principe (j'ai pas tout installé, mbrola & co, donc pas pu essayer).
C'est juste la copie d'un exemple de la doc pygtk qui est une sorte de mini navigateur, j'y ai juste ajouter un event et une fonction (c'est entouré de #######Debut ajout et #########Fin ajout)
#!/usr/bin/env python
import os, stat, time
import pygtk
pygtk.require('2.0')
import gtk
dossierxpm = [
"17 16 7 1",
" c #000000",
". c #808000",
"X c yellow",
"o c #808080",
"O c #c0c0c0",
"+ c white",
"@ c None",
"@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@",
"@@+XXXX.@@@@@@@@@",
"@+OOOOOO.@@@@@@@@",
"@+OXOXOXOXOXOXO. ",
"@+XOXOXOXOXOXOX. ",
"@+OXOXOXOXOXOXO. ",
"@+XOXOXOXOXOXOX. ",
"@+OXOXOXOXOXOXO. ",
"@+XOXOXOXOXOXOX. ",
"@+OXOXOXOXOXOXO. ",
"@+XOXOXOXOXOXOX. ",
"@+OOOOOOOOOOOOO. ",
"@ ",
"@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@"
]
dossierpb = gtk.gdk.pixbuf_new_from_xpm_data(dossierxpm)
fichierxpm = [
"12 12 3 1",
" c #000000",
". c #ffff04",
"X c #b2c0dc",
"X XXX",
"X ...... XXX",
"X ...... X",
"X . ... X",
"X ........ X",
"X . .... X",
"X ........ X",
"X . .. X",
"X ........ X",
"X . .. X",
"X ........ X",
"X X"
]
fichierpb = gtk.gdk.pixbuf_new_from_xpm_data(fichierxpm)
class ExplListeFichiersFoncDonnees:
noms_colonnes = ['Nom', 'Taille', 'Mode', 'Derniere modification']
def evnmt_delete(self, widget, evnmt, donnees=None):
gtk.main_quit()
return False
def __init__(self, dossier = None):
fonct_donnees_cell = (None, self.taille_fichier, self.mode_fichier,
self.modif_fichier)
# Creation d'une nouvelle fenetre
self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.fenetre.set_size_request(400, 300)
self.fenetre.connect("delete_event", self.evnmt_delete)
###### Debut ajout
self.fenetre.connect("key_release_event", self.evnmt_key)
###### Fin ajout
modeleliste = self.creer_liste(dossier)
# Creation du TreeView
self.treeview = gtk.TreeView()
# Creation des TreeViewColumn pour afficher les donnees
self.tvcolumn = [None] * len(self.noms_colonnes)
cellpb = gtk.CellRendererPixbuf()
self.tvcolumn[0] = gtk.TreeViewColumn(self.noms_colonnes[0], cellpb)
self.tvcolumn[0].set_cell_data_func(cellpb, self.fichier_pixbuf)
cell = gtk.CellRendererText()
self.tvcolumn[0].pack_start(cell, False)
self.tvcolumn[0].set_cell_data_func(cell, self.nom_fichier)
self.treeview.append_column(self.tvcolumn[0])
for n in range(1, len(self.noms_colonnes)):
cell = gtk.CellRendererText()
self.tvcolumn[n] = gtk.TreeViewColumn(self.noms_colonnes[n], cell)
if n == 1:
cell.set_property('xalign', 1.0)
self.tvcolumn[n].set_cell_data_func(cell, fonct_donnees_cell[n])
self.treeview.append_column(self.tvcolumn[n])
self.treeview.connect('row-activated', self.ouvrir_fichier)
self.fenetredefilmt = gtk.ScrolledWindow()
self.fenetredefilmt.add(self.treeview)
self.fenetre.add(self.fenetredefilmt)
self.treeview.set_model(modeleliste)
self.fenetre.show_all()
return
###### Debut ajout
def evnmt_key(self,widget, event):
key=gtk.gdk.keyval_name(event.keyval)
if key == 'Down' or key == 'Up':
modele = self.treeview.get_model()
sel=self.treeview.get_selection()
(model,iter)=sel.get_selected()
print list(model[iter])
chaine=list(model[iter])[0]
arg='espeak -v mb/mb-fr4 -s 130 -p 30 "%s" | mbrola /opt/mbrola/fr4/fr4 - -.au | aplay' % chaine
os.system(arg)
###### Fin ajout
def creer_liste(self, dossier=None):
if not dossier:
self.nomrep = os.path.expanduser('~')
else:
self.nomrep = os.path.abspath(dossier)
self.fenetre.set_title(self.nomrep)
fichiers = [f for f in os.listdir(self.nomrep) if f[0] <> '.']
fichiers.sort()
fichiers = ['..'] + fichiers
modeleliste = gtk.ListStore(object)
for f in fichiers:
modeleliste.append([f])
return modeleliste
def ouvrir_fichier(self, treeview, chemin, colonne):
modele = treeview.get_model()
iter = modele.get_iter(chemin)
nomfichier = os.path.join(self.nomrep, modele.get_value(iter, 0))
statsfichier = os.stat(nomfichier)
if stat.S_ISDIR(statsfichier.st_mode):
nouvmodele = self.creer_liste(nomfichier)
treeview.set_model(nouvmodele)
return
def fichier_pixbuf(self, colonne, cell, modele, iter):
nomfichier = os.path.join(self.nomrep, modele.get_value(iter, 0))
statsfichier = os.stat(nomfichier)
if stat.S_ISDIR(statsfichier.st_mode):
pb = dossierpb
else:
pb = fichierpb
cell.set_property('pixbuf', pb)
return
def nom_fichier(self, colonne, cell, modele, iter):
cell.set_property('text', modele.get_value(iter, 0))
return
def taille_fichier(self, colonne, cell, modele, iter):
nomfichier = os.path.join(self.nomrep, modele.get_value(iter, 0))
statsfichier = os.stat(nomfichier)
cell.set_property('text', statsfichier.st_size)
return
def mode_fichier(self, colonne, cell, modele, iter):
nomfichier = os.path.join(self.nomrep, modele.get_value(iter, 0))
statsfichier = os.stat(nomfichier)
cell.set_property('text', oct(stat.S_IMODE(statsfichier.st_mode)))
return
def modif_fichier(self, colonne, cell, modele, iter):
nomfichier = os.path.join(self.nomrep, modele.get_value(iter, 0))
statsfichier = os.stat(nomfichier)
cell.set_property('text', time.ctime(statsfichier.st_mtime))
return
def main():
gtk.main()
if __name__ == "__main__":
exemple = ExplListeFichiersFoncDonnees()
main()
Tu le copie dans un fichier, le rendre executable puis le lancer dans la console pour avoir le retour d'éventuels bug !
A voir si la commande espeak fonctionne ???
Si le principe te conviens, il sera très facile d'améliorer (options en +, key surveiller, etc,etc... enfin pour en faire un navigateur nautilus like koi !). Si tu pars sur cette base, beaucoup de choses te seront permises 😉
EDIT: Je ne sais pas quelles sont les manques niveau accessibilté, mais je suppose que le problème peut aussi se présenter avec l'accès au clic droit (menu petit), pour renommer ?
En tout cas, en passant par un navigateur personnlisé, tous (presque) est possible (mais cela m'étonne que ca n'existe pas encore !).
Je suppose qu'il doit exister un systeme de loupe, mais il serait aussi possible de faire des appli maxi-taille (enfin maxi caractères plutot ) ou/et vocal.