Bonjour à tous,
Débutant en python et gtk je souhaite réaliser une application
simple pour débuter soit une fenêtre composée de deux listes.
Entre ces deux liste deux boutons l'un pour ajouter un élément de la liste 1 vers la liste 2 et l'autre pour enlever l'élément ajouté dans la liste 2 et le replacer dans la liste 1.
Pour créer la fenêtre j'utilise glade 2.6.8. J'avoue ne pas comprendre la gestion des treeview avec pygtk, vous allez sûrement me conseiller d'aller jeter un oeil sur la faq de pygtk ou dans le reference manual, ce que j'ai fait (mon anglais est assez limité), aussi pouvez vous s'il vous plais m'expliquer les treeview ?
je vous en remercie par avance,
Pascal
# quelques explications
Posté par TImaniac (site web personnel) . Évalué à 2.
Donc tu as 2 solutions : soit tu implémentes un TreeModel à la main, soit tu utilises un TreeStore, qui lui est founi et implémente TreeModel.
Donc tu construis un TreeStore, tu dis au TreeView de l'afficher (méthode set_Model), et tu remplies ton TreeStore avec les méthodes append ou insert.
Et là tu vas te dire : mais c'est quoi un TreeIter que me demande append et insert ? Ben c'est un "itérateur" dans l'arbre, bref une sorte d'adresse indiquant l'emplacement où doit être inséré l'objet. Plusieurs méthodes permettent de récupérer un TreeIter dans un TreeModel (get_first, etc.).
A toi de jouer :)
[^] # Re: quelques explications
Posté par iOops (site web personnel) . Évalué à 1.
[^] # Re: quelques explications
Posté par TImaniac (site web personnel) . Évalué à 2.
Le TreeModel est un "modèle", une interface que doit implémenter un objet pour pouvoir être affiché dans l'arbre. C'est dans cet objet que le TreeView va aller chercher les informations à afficher.
Comme c'est super lourd d'implémenter tout TreeModel à la main, tu utilises la classe toute prête TreeStore (litéralement stockage d'un arbre) qui est une implémentation de TreeModel.
Dans Glade tu positionnes uniquement la partie affichage de l'arbre, le TreeView donc. Tu ne peux pas accéder au TreeModel (et pour cause, par défaut le TreeView n'en a pas de connecté), tu ne peux donc pas "remplir" ton TreeView à l'aide de Glade.
C'est à toi de dynamiquement (par programmation), connecter une instance de TreeStore au TreeView comme je te l'ai expliqué en pseudo code. Après tu ne touches plus jamais au TreeView pour afficher des données, tu te contentes de "remplir" le TreeStore par programmation, le TreeView se démerdera tout seul comme un grand pour gérer l'affichage de ton arbre.
T'as compris quelque chose à mon charabia ?
[^] # Re: quelques explications
Posté par iOops (site web personnel) . Évalué à 1.
j'ai ouvert #pygtk-fr sur freenode ...
[^] # Re: quelques explications
Posté par iOops (site web personnel) . Évalué à 1.
TreeView1 = liste.get_widget("List1_WIndex")
# Création du TreeStore : Une colonne de type String
Model = gtk.TreeStore(gobject.TYPE_STRING)
# Connexion du Model au TreeView
TreeView1.set_model(Model)
# Création de la colonne
Column0 = gtk.TreeViewColumn('Column 0')
# Ajout de la colonne au TreeView
TreeView1.append_column(Column0)
Lors du lancehemnt du programme j'obitien bien un colonne portant le nom de "Column 0"
Je souhaites maintenant créer un ligne avec du texte, d' après ce que j'ai compris du fonctionnement, il faudrais créer une cellule, et l'ajouter à la colonne.
J'ai donc procédé de la façon suivante :
# Création d'une cellule
cell = gtk.CellRendererText()
# les cellules de la colonnes 0 sont vissible
Column0.cell_is_visible()
# Ajout de la cellule à la colonne 0
Column0.pack_start(cell, True)
J'ai ajouté ce petit paragraphe avant le commentaire :
#L'ajout de la colonne au TreeView
Lors de l'exécution du programme je n'ai aucune erreur, mais je ne voi aucune cellule vide de créée en dessous de la colonne 0, je ne comprend pas aussi comment insérer du texte dans une cellule j'ai pensé à :
Model.prepend(None, ['coucou'])
Mais celà ne donne rien ...
[^] # Re: quelques explications
Posté par TImaniac (site web personnel) . Évalué à 2.
renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn("Folder", renderer, text=1)
Sinon le reste a l'air bon, tu vires ce qui concerne le pack_start, et effectivement pour ajouter du texte il faut aller taper dans le Model.
Le problème c'est que le Python et moi ca fait 2 :)
Mais bon ca reste du GTK.
Un tutorial avec des explications par là :
http://liw.iki.fi/liw/texts/gtktreeview-tutorial.html(...)
[^] # Re: quelques explications
Posté par iOops (site web personnel) . Évalué à 1.
[^] # Re: quelques explications
Posté par TImaniac (site web personnel) . Évalué à 2.
Enfin GTK c'est GTK, quelque soit le langage c'est les mêmes méthodes :)
[^] # Re: quelques explications
Posté par iOops (site web personnel) . Évalué à 1.
j'essaye donc ceci :
Tv0 = liste.get_widget("Tv0_WIndex")
# Création d'une ListeStore : 1 colonne de type String
Model = gtk.ListStore(str)
# Connexion du Model avec le TreeView
Tv0.set_model(Model)
# Cellule
cell0 = gtk.CellRendererText()
# Définition de la Colonne 0
Col0 = gtk.TreeViewColumn("Titre ", cell0, text=0)
# Ajout de la colonne au TreeView
Tv0.append_column(Col0)
# Ajout d'une ligne
row = (["Coucou"])
Model.append(row)
Je n'ai aucun message d'erreur, et la ligne "Coucou" ne s'affiche pas :/
[^] # Re: quelques explications
Posté par iOops (site web personnel) . Évalué à 1.
mon code est juste.
Par défaut (chez moi) dans glade lorsque je créer un TreeVieW il ne m'affiche que l'entête des colonnes, il faut que je donne la bonne "height" au TreeVieW dans l'onglet "Common" pour pouvoir voir le corps de la liste. Je pensais que le corps de la liste ne s'affichait que si je le remplissait. Donc voilà celà fait plus de 3jours de galère pour une tit idiotie :-) Merci encore à ceux qui m'ont répondu
[^] # Re: quelques explications
Posté par Christophe Lucas (site web personnel) . Évalué à 1.
Je n'ai pas trop de soucis avec les TreeStore et Treview, mais j'aimerais faire une ligne dans le genre : "du texte et au bout un bouton". Le problème que j'ai c'est qu'il y a des CellRenderer pour du texte, des gdppixbuf, ... mais pas de CellRendererButton()
J'ai cherché sur le net mais pas trouvé.
J'ai pensé à TableView, mais ceux-ci sont de taillse fixes, donc pas adapté pour afficher une listes de taille variable.
Si vous avez des idées, je suis preneur...
Merci d'avance,
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.