Forum Programmation.python pygtk treeview/list

Posté par  (site web personnel) .
Étiquettes : aucune
0
16
août
2005
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  (site web personnel) . Évalué à 2.

    Un TreeView affiche le contenu d'un objet TreeModel.
    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  (site web personnel) . Évalué à 1.

      Dans glade le TreeModel est représenté de quelle façon ?
      • [^] # Re: quelques explications

        Posté par  (site web personnel) . Évalué à 2.

        Dans Glade il n'est pas représenté.
        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  (site web personnel) . Évalué à 1.

          Je crois oui :-) merci

          j'ai ouvert #pygtk-fr sur freenode ...
          • [^] # Re: quelques explications

            Posté par  (site web personnel) . Évalué à 1.

            Je pense que je ne suis plus très loin du but :


            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  (site web personnel) . Évalué à 2.

              Non en fait t'as pas de notion de "cellule" à ajouter, mais tu dois spécifier un objet qui va effectuer le "rendu", l'affichage des cellules dans une colonne, donc si tu veux afficher du texte c'est un CellRendererText, mais tu le précises à la création de la cellule :

              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  (site web personnel) . Évalué à 1.

                tu utilises quel langage ?
                • [^] # Re: quelques explications

                  Posté par  (site web personnel) . Évalué à 2.

                  C#
                  Enfin GTK c'est GTK, quelque soit le langage c'est les mêmes méthodes :)
                • [^] # Re: quelques explications

                  Posté par  (site web personnel) . Évalué à 1.

                  Je pense que je me trompe de model ce que je veux c'est une liste, je ne cherche pas à représenter ma liste sous forme d'arbre.

                  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  (site web personnel) . Évalué à 1.

                    Bon,

                    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  (site web personnel) . Évalué à 1.

                      Salut,

                      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.