Pages : 1
#1 Le 13/12/2006, à 00:53
- bakalegum_
recherche un "mentor" pour pygtk
bonjour a tous,
je voudrais savoir si quelqu un qui a deja touché a pygtk voudrais bien m aider... je butte sur le concept de "treeview" je sent que c est ce dont j ai besoin, mais je bloque sur le concept, et tout ce que j ai pu lire ne ma pas aider...
donc est ce que quelqu un voudrait bien me prendre sous son aile pour m expliquer un peu??
merci
bakalegun
Hors ligne
#2 Le 14/12/2006, à 12:43
- bakalegum_
Hors ligne
#3 Le 14/12/2006, à 13:05
- Pho8os
Re : recherche un "mentor" pour pygtk
hello
Ben dit toujours, on va bien voir ....
Que souhaites tu faire ?
Hors ligne
#4 Le 14/12/2006, à 13:52
- bakalegum_
Re : recherche un "mentor" pour pygtk
bon alors sans ecrire un roman voici mon projet:
je veux fait un "super copier" pour nunux, si tu ne connais pas il s agit d un gestionnnaire de copie, qui permet de faire pause, changer de debit en tps reel des copies..de plus vu qu il existe tout un tas d option pour le cp, d autre option sont envisageable. pour l instant grace a nautilus action, et queslques script bash je peux mettre des copies a la suite, voir l avancement des copies, ainsi que leur vitesse, il me reste a simuler un ctrl +Z pour mettre le tout en pause et j aurais une version utilisable de l utilitaire.
donc dans le fonctionnement du programme je dispose d un fichier texte dans le quel se trouve ala suite le chemin de tous les fichiers que je veux copier. je voudrais afficher cette liste de maniere graphique dans une fenetre,en l actualisant des qu une copie est terminée, c est a dire en enlevant le fichier de la liste. puis dans un second temps pouvoir modifier l ordre des fichiers en liste (le premier etant celui qui sera copie juste apres) et aussi pouvoir faire un glisser deposer de l exterieur de nautilus vers la liste en le placant a l endroit voulu dans la file d attente. a cela se rajoute un bouton anuler un bouton pause qui devient reprise une fois enfoncé ainsi qu une reglette pour modifier le debit de copie...
je ne sais pas s i c est tres clair
cela me semble tout a fait faisable, et pas trop difficile
qu en penses tu?
bakalegum
Dernière modification par bakalegum_ (Le 14/12/2006, à 13:53)
Hors ligne
#5 Le 14/12/2006, à 16:00
- Pho8os
Re : recherche un "mentor" pour pygtk
Tu souhaites donc faire une appli gtk qui affiche, dans une liste, le contenu ligne par ligne du fichier ?
A ce moment, ton idée d'utiliser un treeview était effectivement la bonne. C'est un treeview qui affiche les liste en gtk. (liste=treeview à un seul "étage")
Cette application semble effectivment "relativement" simple à écrire. Le plus "difficile" sera peut être la mise à jour sur changement du contenu de fichier. Mais je sais que c'est faisable avec gnomevfs
A priori les exemples du tutorial pygtk te seront grandement utiles et peuvent, à mon avis, contituer une bonne base.
N'hésites pas si t'as d'autre question(s)
Hors ligne
#6 Le 14/12/2006, à 16:20
- bakalegum_
Re : recherche un "mentor" pour pygtk
je vais essayer de "pondre" un bout de code tout bete pour afficher le contenue dun fichier texte dans un treeview.. je te le soumetrais...
Hors ligne
#7 Le 14/12/2006, à 16:37
- Pho8os
Re : recherche un "mentor" pour pygtk
no problemo
bon courage !
Hors ligne
#8 Le 14/12/2006, à 18:30
- bakalegum_
Re : recherche un "mentor" pour pygtk
bon alors voila j ai essayé d utiliser
http://mcclinews.free.fr/python/pygtktu … dDrop.html
et ca
http://mcclinews.free.fr/python/pygtktu … idget.html
dans le meme code ce qui donne
#!/usr/bin/env python
# exemple treeviewbasique.py
import pygtk
pygtk.require('2.0')
import gtk
class ExempleTreeViewBasique:
CIBLES = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0),('text/plain', 0, 1),('TEXT', 0, 2),('STRING', 0, 3),]
# fermeture de la fenetre et sortie du programme
def evnmt_delete(self, widget, evnmt, donnees=None):
gtk.main_quit()
return False
def __init__(self):
# Creation d'une nouvelle fenetre
self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.fenetre.set_title("Exemple TreeView")
self.fenetre.set_size_request(200, 400)
self.fenetre.connect("delete_event", self.evnmt_delete)
# Creation d'un TreeStore avec une colonne de type chaine, pour servir de model
self.treestore = gtk.TreeStore(str)
# Ajoutons des donnees : 4 lignes ayant 3 lignes filles chacune
fichier = open('/home/baka/Desktop/Lalist.txt', 'r')
list = fichier.readlines()
for x in range(len(list)):
m_iter = self.treestore.append(None, [' %s' % list[x]])
# creation du TreeView en utilisant notre TreeStore
self.treeview = gtk.TreeView(self.treestore)
# creation du TreeViewColumn pour afficher les donnees
self.tvcolumn = gtk.TreeViewColumn('fichiers a copier')
# on place tvcolumn dans notre TreeView
self.treeview.append_column(self.tvcolumn)
# creation d'un CellRendererText pour afficher les donnees
self.cell = gtk.CellRendererText()
# on place cell dans le TreeViewColumn et on lui permet de s'etirer
self.tvcolumn.pack_start(self.cell, True)
# reglage de l'attribut "text" de cell sur la colonne 0 - recupere le
# texte dans cette colonne du TreeStore
self.tvcolumn.add_attribute(self.cell, 'text', 0)
# on autorise la recherche
self.treeview.set_search_column(0)
# on autorise la classement de la colonne
#self.tvcolumn.set_sort_column_id(0)
# on autorise le classement des lignes par glisser-deposer
self.treeview.set_reorderable(True)
self.fenetre.add(self.treeview)
self.fenetre.show_all()
self.treeview.enable_model_drag_source( gtk.gdk.BUTTON1_MASK,self.CIBLES,gtk.gdk.ACTION_DEFAULT|gtk.gdk.ACTION_MOVE)
self.treeview.enable_model_drag_dest(self.CIBLES,gtk.gdk.ACTION_DEFAULT)
def donnees_du_glisser(self, treeview, context, selection, id_cible,etime):
treeselection = treeview.get_selection()
modele, iter = treeselection.get_selected()
donnees = modele.get_value(iter, 0)
selection.set(selection.target, 8, donnees)
def donnees_du_deposer(self, treeview, context, x, y, selection,info, etime):
modele = treeview.get_model()
donnees = selection.data
info_depot = treeview.get_dest_row_at_pos(x, y)
if info_depot:
chemin, position = info_depot
iter = modele.get_iter(chemin)
if (position == gtk.TREE_VIEW_DROP_BEFORE or position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE):
modele.insert_before(iter, [donnees])
else:
modele.insert_after(iter, [donnees])
else:
modele.append([donnees])
if context.action == gtk.gdk.ACTION_MOVE:
context.finish(True, True, etime)
return
def main():
gtk.main()
if __name__ == "__main__":
exempletv = ExempleTreeViewBasique()
main()
avec /home/baka/desktop/Lalist.txt qui contient
/home/baka/bin
/home/baka/caya
/home/baka/screencap
/media/fat/logz
/media/fat/Mes Images
/media/fat/mes videos
/media/fat/nokia
/media/fat/pas bien!
/media/fat/perso linux
/media/fat/baka/Desktop
mais bon je n arrive pas a glisser quoi que ce soit dans la liste, je n arrive meme plus a faire fonctionner le glisser deposer interne , qui marchat au debut...
help, je tourne en rond..mais bon je suis rassuré c est exactement ce dont j ai besoin
Hors ligne
#9 Le 15/12/2006, à 10:20
- Pho8os
Re : recherche un "mentor" pour pygtk
ok, pas mal.
Si ton drag&drop ne fonctionne pas (plus...) c'est parce que tu ne connectes pas l'évenement "drop" à ta méthode "donnee_du_deposer"
Rajoute, ligne 58 quelque chose comme
self.treeview.connect("drag-data-received",self.donnee_du_deposer)
Dernière modification par Pho8os (Le 15/12/2006, à 10:24)
Hors ligne
#10 Le 15/12/2006, à 16:16
- aleph
Re : recherche un "mentor" pour pygtk
Trois peites remarques.
Très important. Ne jamais oublier de fermer un fichier.
f = open(.....)
#lecture des données
f.close()
Moins important. Eviter d'utiliser le nom d'un type de variable comme nom de variable.
li = ['a', 'b', 'c']
et non
list = ['a', 'b', 'c']
En Python, le méthode correcte pour parcourir une <list> est
li = ['a', 'b', 'c']
for e in li:
print e
a
b
c
et non
li = ['a', 'b', 'c']
for i in range(len(li)):
print li[i]
a
b
c
Brève explication. En Python certains type de données (ou ceux que l'on crée) ont une méthode
itérative sous-jacente qui se manifeste lorsque l'on utilise une commande comme
for element in <type itérable>
Ne pas utiliser cette propriété est contraproductif. C'est l'âme de Python.
Exemple avec un <tuple>
tu = ('a', 'b', 'c')
for e in tu:
print e
a
b
c
Exemple avec un <dictionary>
di = (1: 'a', 2: 'b', 3:'c')
for e in di:
print e, di[e]
1 a
2 b
3 c
Dans le dernier exemple, il y a mieux mais je passe ici sous silence.
#11 Le 15/12/2006, à 17:16
- bakalegum_
Re : recherche un "mentor" pour pygtk
@ aleph: merci pour ce precision j en prend note
donc voila j ai rajouté ca
# on autorise le classement des lignes par glisser-deposer
self.treeview.set_reorderable(True)
self.treeview.connect("drag-data-received",self.donnee_du_deposer)
self.fenetre.add(self.treeview)
self.fenetre.show_all()
mais j obtient ce message d erreur
self.treeview.connect("drag-data-received",self.donnee_du_deposer)
AttributeError: ExempleTreeViewBasique instance has no attribute 'donnee_du_deposer'
je continue a chercher...
edit:
j ai trouvé c est parce qu il manque un S
bon alors autre message d erreur au drag drop maintenant:
> baka@ElPeTioT:~$ python /home/baka/Desktop/treecopier.py
Traceback (most recent call last):
File "/home/baka/Desktop/treecopier.py", line 85, in donnees_du_deposer
modele.insert_before(iter, [donnees])
TypeError: sibling must be a GtkTreeIter or None
la je bloque
Dernière modification par bakalegum_ (Le 15/12/2006, à 17:21)
Hors ligne