Bonjour
Je rencontre un problème pour modifier une ligne d'un Treestore, sur lequel il y a un Treefilter

Etant donné que dans la boucle événementielle il y a actualisation en permanence de l'affichage avec le Treefilter, je suis arrivé à la conclusion que le Treemodel est non peristant et donc quand j'appelle la routine de modification par le bouton modifier , j'ai déjà perdu .......l'ITER ne sera plus valide

cf le code ci-dessus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
 
#!/usr/bin/env python
# -*- coding:Utf-8 -*-
 
# exemple treemodelfilter.py
 
import pygtk
pygtk.require('2.0')
import gtk
 
bugdata="""121339 RESO important JOB Trimestriel  dsextras.py installation directory is incorrect
121611 RESO important JOB Trimestriel  argument is guint, should be guint32
121943 RESO important JOB Trimestriel  gtk.mainiteration and gtk.mainloop defeat the caller's ex...
122260 RESO important JOB Trimestriel  Could not compile
122569 NEW  urgent JOB hebdomadaire gtk.Window derived class segfaults
122591 RESO important JOB Trimestriel  cannot return None from CellRenderer.on_start_editing
122755 RESO important JOB Trimestriel  _wrap_gdk_window_NEW  urgent JOB hebdomadaire veri memo personnel mensuel urgent personnel mensuels to ref return value
122786 RESO important JOB Trimestriel  don't import Numeric until it is first used
123014 NEW  urgent JOB hebdomadaire PyGtk build problem on Win32 using the 'distutils' approach.
123037 NEW  urgent JOB hebdomadaire gtk.ListStore.set_column_types is missing
123456 RESO important JOB Trimestriel  ItemFactory.create_items and <ImageItem> bug
123458 veri memo personnel mensuel urgent personnel mensuel pygtk does not wrap all of gdk-pixbuf
123891 NEW  urgent JOB hebdomadaire gobject.PARAM_CONSTRUCT problem
124181 veri memo personnel mensuel urgent personnel mensuel Python Shell inside a gtk GUI
124338 RESO important JOB Trimestriel  Memleak when using pixbuf
124593 RESO important JOB Trimestriel  TreeModel.iter_children should accept None as parent
125172 RESO important JOB Trimestriel  gtk.TreeModelSort returns an unusable object
125272 RESO important JOB Trimestriel  error in gtk_widget_translate_coordinates wrapping
125445 NEW  urgent JOB hebdomadaire pygtk gives no acces to PangoLayoutIter's
125533 RESO important JOB Trimestriel  set_skip_taskbar_hint and set_skip_pager_hint not wrapped
126109 RESO important JOB Trimestriel  gtk.Entry focus_out event core
126323 RESO important JOB Trimestriel  gtk_disable_setlocale cannot be used
126406 RESO important JOB Trimestriel  gtk.TreeView.expand_row() should return gboolean not None
126479 RESO important JOB Trimestriel  None iter's in custom TreeModel cause SystemException's
127083 RESO important JOB Trimestriel  Binding generation of methods which use gpointer does not...
127178 RESO important JOB Trimestriel  gtk.Widget color modify methods do not allow None for col...
127504 NEW  urgent JOB hebdomadaire wrap GtkTreeViewColumnDropFunc
128623 RESO important JOB Trimestriel  Allow NULL as set_tip argument
128988 RESO important JOB Trimestriel  missing space in prototype confuses h2def.py
129032 NEW  urgent JOB hebdomadaire GObject Interfaces (GInterface) support
129414 RESO important JOB Trimestriel  h2def.py doesn't see gda_log_enable()
129490 RESO important JOB Trimestriel  Provide hardware_keycode to python
129754 RESO important JOB Trimestriel  memory leak with gtk.gdk.pixmap_foreign_NEW  urgent JOB hebdomadaire()
129843 NEW  urgent JOB hebdomadaire Make all constructors work through g_object_NEW  urgent JOB hebdomadaire()
129966 RESO important JOB Trimestriel  convert GValue containing GValueArray to PyObject
131837 RESO important JOB Trimestriel  Cannot set or get \"markup\" property from CellRendererText
132040 NEW  urgent JOB hebdomadaire abusing setdefaultencoding()
132058 RESO important JOB Trimestriel  gtkgl bus error on constructor to gtk.gl.Area
132507 RESO important JOB Trimestriel  gtk_accel_group_connect seems to be missing
132837 NEW  urgent JOB hebdomadaire set_from_pixmap creates a different gtk.Image than set_fr...
133681 RESO important JOB Trimestriel  memory leak in gdk.drawable.get_image
134462 RESO important JOB Trimestriel  pygtk2 segfaults
134491 RESO important JOB Trimestriel  OverflowError occurs when menu pops up.
134494 RESO important JOB Trimestriel  The Definition of argument for gtk.gdk.Pixbuf.fill should...
135279 RESO important JOB Trimestriel  codegen is using private functions
135439 RESO important JOB Trimestriel  Integrate SDL into pygtk widgets
135963 RESO important JOB Trimestriel  gc of gtk.ListStore aborts intrepeter after gtk.threads_i...
136204 RESO important JOB Trimestriel  GtkTextSearchFlags warning
136205 RESO important JOB Trimestriel  GdkPixbuf.fill passed arg changed type originating crash
136297 RESO important JOB Trimestriel  Explanatory additions to gtk.DrawingArea
136597 RESO important JOB Trimestriel  gtkgl still referenced in build files
136688 RESO important JOB Trimestriel  installation directory of pygtk 2.2
136705 RESO important JOB Trimestriel  mainquit vs. main_quit usage
136707 RESO important JOB Trimestriel  gtk.gdk.Window.raise uses reserved keyword.
136731 RESO important JOB Trimestriel  setup.py should not install the libglade DLL
136811 RESO important JOB Trimestriel  h2def ignores some functions
136984 RESO important JOB Trimestriel  Seemingly Invalid Flag for gtk.MessageDialog
136989 NEW  urgent JOB hebdomadaire should pixbufloader throw two GErrors?
137086 NEW  urgent JOB hebdomadaire gtk.gdk.window_lookup assertion
137091 RESO important JOB Trimestriel  \"constants\" for selection atoms
137935 RESO important JOB Trimestriel  description of gtk.gdk.atom_intern() should be in gtk.gdk...
137969 NEW  urgent JOB hebdomadaire GenericTreeModel/TreeSelection returning GtkTreeIter inst...
138104 RESO important JOB Trimestriel  gtk_widget_style_get_property is not wrapped
138163 veri memo personnel mensuelNOTA gtk.main_iteration(TRUE) unblocks every .1 seconds
138476 RESO important JOB Trimestriel  gtk.Layout is veri memo personnel mensuel urgent personnel mensueled by gnome.canvas but is missing from ...
138487 RESO important JOB Trimestriel  PyGTK Tutorial: in Calendar sample date string is 1 day b...
138576 RESO important JOB Trimestriel  gtk.IconSet now has 2 constructors in gtk.defs, while on...
138619 NEW  urgent JOB mensuel codegen/definitions.py could use some refactoring
138772 RESO important JOB Trimestriel  Callback parameters to input_add are incorrect
138804 NEW  urgent JOB mensuel In gtk2.4, gdk_font_get_display and gdk_pixmap_lookup is ...
138944 NEW  urgent JOB mensuel Cannot import gtk when pygtk installed using 'make install'
139128 NEW  urgent JOB mensuel All constructors should be defined as constructors
139130 NEW  urgent JOB hebdomadaire GtkEntry's constructor veri memo personnel mensuel urgent personnel mensuels to be rewritten
139312 veri memo personnel mensuel urgent personnel mensuel gtk.gdk.Window.get_screen method undocumented.
139921 RESO important JOB Trimestriel  Support tp_NEW  urgent JOB hebdomadaire
140071 NEW  urgent JOB hebdomadaire Register custom widget classes.
140665 RESO important JOB Trimestriel  TypeError when creating user defined signals having third...
140718 NEW  urgent JOB mensuel Enhance codegen with user defined type wrapper.
140946 NEW  urgent JOB mensuel filechooser example broken
141042 RESO important JOB Trimestriel  Garbage collection causes lossage in Pango
141886 NEW  urgent JOB mensuel Add a PyGEnum_Type
142030 RESO important JOB Trimestriel  Possible ref count error in gtk.GC
142738 RESO important JOB Trimestriel  Fatal error with multi-depth menus
142997 NEW  urgent JOB mensuel require() breaks sys.path if libs found in /usr/local/r/local
444444 BIDO urgent JOB Trimestriel breaks sys.path if libs found in /usr/local/r/local ligne bidon"""
 
class TreeModelFilterExemple:
 
    # ferme la fenetre et quitte
    def delete_event(self, widget, event, donnees=None):
        gtk.main_quit()
        return False
 
    def __init__(self):
        # Cree une nouvelle fenetre
        self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
 
        self.fenetre.set_title("Exemple TreeModelFilter")
 
        self.fenetre.set_size_request(600, 400)
 
        self.fenetre.connect("delete_event", self.delete_event)
 
        # creea un liststore avec une colonne de type chaine comme modele
        self.liststore = gtk.ListStore(int, str, str,str,str,str)
 
        self.filtremodele = self.liststore.filter_new() #le modèle de filtrage ici appliqué sur le list store normal c'est sur les donnees q'ont filtrent
 
        # cree le TreeView
        self.treeview = gtk.TreeView()
 
        # cree les colonnes du TreeView pour afficher les donnees
        self.treeview.colonnes = [None]*6
        self.treeview.colonnes[0] = gtk.TreeViewColumn('Bug No.')
        self.treeview.colonnes[1] = gtk.TreeViewColumn('Statut')
        self.treeview.colonnes[2] = gtk.TreeViewColumn('importance')
        self.treeview.colonnes[3] = gtk.TreeViewColumn('domaine')
        self.treeview.colonnes[4] = gtk.TreeViewColumn(u'périodicité')
        self.treeview.colonnes[5] = gtk.TreeViewColumn('Description')
 
 
        # ajoute les donnees de bug
        self.etats = []
        compteur=1
        for line in bugdata.split('\n'):
            l = line.split()
 
            liste=[int(l[0]), l[1],l[2],l[3], l[4],' '.join(l[5:])]
            #print "long= ",len(liste)," ",liste
            self.liststore.append(liste)
            #self.liststore.append([int(l[0]), l[1], l[2],' '.join(l[2:])])
            #self.liststore.append([int(l[0]), l[1],l[2],l[3], ' '.join(l[4:])])
            if not l[1] in self.etats:
                self.etats.append(l[1]) # les clés de filtrage faites ici
 
 
        self.montre_etats = self.etats[:]
        self.filtremodele.set_visible_func(self.visible_cb, self.montre_etats) # mecanisme qui va appliquer le mécanisme à l'init
        #  et en permanence
 
        self.treeview.set_model(self.filtremodele) # lien avec le modele qui visualise les données
        self.treeview.set_reorderable(True)
 
        for n in range(6):
            #self.treeview.colonnes[n].set_search_column(1)
            self.treeview.colonnes[n].set_sort_column_id(n)
            # ajoute les colonnes au treeview
            self.treeview.append_column(self.treeview.colonnes[n])
            # cree un CellRenderers pour formater les donnees
            self.treeview.colonnes[n].cell = gtk.CellRendererText()
            # ajoute les cellules aux colonnes
            self.treeview.colonnes[n].pack_start(self.treeview.colonnes[n].cell,
                                                True)
 
 
 
 
            self.treeview.colonnes[n].set_resizable(True)
            self.treeview.colonnes[n].set_reorderable(n)
            self.treeview.colonnes[n].set_sort_column_id(n)
            # fixe les attibuts de cellule a la colonne adequate
            self.treeview.colonnes[n].set_attributes(
                self.treeview.colonnes[n].cell, text=n)
 
 
        # autorise la recherche dans le treeview
        self.treeview.set_search_column(3)
 
        # cree l'interface utilisateur
        self.boitever = gtk.VBox()
        self.fen_deroule = gtk.ScrolledWindow()
        self.boite_bouton = gtk.HButtonBox()
        self.boitever.pack_start(self.fen_deroule)
        self.boitever.pack_start(self.boite_bouton, False)
        # cree un bouton bascule pour choisir les filtres utilises
        # selon l'etat des bugs et rend les boutons actifs
        for state in self.etats:
            bouton = gtk.ToggleButton(state)
            self.boite_bouton.pack_start(bouton)
            bouton.set_active(True)
            bouton.connect('toggled', self.verif_boutons) #  le connect qui change la clef de filtrage sur click
 
        bouton2=gtk.ToggleButton("job")
        bouton2.set_active(True)
        self.boite_bouton.pack_start(bouton2)
        bouton3=gtk.ToggleButton("personnel")
        bouton3.set_active(True)
        self.boite_bouton.pack_start(bouton3)
 
 
        bouton3=gtk.ToggleButton("modifier")
        bouton3.set_active(True)
        self.boite_bouton.pack_start(bouton3)
        bouton3.connect('toggled', self.modify)
 
        #bouton2.connect('toggled', self.verif_boutonsjob) #  le connect qui change la clef de filtrage sur click
        #bouton3.connect('toggled', self.verif_boutonsperso) #  le connect qui change la clef de filtrage sur click
 
        self.fen_deroule.add(self.treeview)
        self.fenetre.add(self.boitever)
 
        self.fenetre.show_all()
        return
 
    def modify(self, donnees):
        TreeSelection =self.treeview.get_selection()
 
	# Get the selection iter
	TreeModel, selection_iter = TreeSelection.get_selected()
 
        modefonction=TreeSelection.get_mode()
        print "modefonction=",modefonction
        if self.liststore.iter_is_valid(selection_iter):
            print "Iter valide"
        else:
            print "Iter invalide"
 
        if gtk.TREE_MODEL_ITERS_PERSIST==self.liststore.get_flags() :
            print "treeview persistant"
        else:
             print "treeview PAS persistant"
        # comme selection_iter est invalide ici je ne peux pas accéder aux données pour les modifier, etc...
 
    # determine la visibilite des donnees selon l'etat des boutons de filtre
    def visible_cb(self, modele, iter, donnees):
        flag=False # faut afficaher ou pas
 
        return modele.get_value(iter, 1) in donnees
 
    def visible_cbjob(self, modele, iter, donnees):
        flag=False # faut afficaher ou pas
 
        return modele.get_value(iter, 1) in donnees
 
    # construit la liste des etats de bug a afficher et les filtre
    def verif_boutons(self, tb):
        del self.montre_etats[:]
        for bouton in self.boite_bouton.get_children():
            if bouton.get_active():
                self.montre_etats.append(bouton.get_label())
        self.filtremodele.refilter()
        return
 
def main():
    gtk.main()
 
if __name__ == "__main__":
    exempletmf = TreeModelFilterExemple()
    main()
j'ai mis un code repris de l'excellent tuto sur Pygtk avec la reproduction de mon problème.

J'ai ensuite 2 questions :

1 la cause de la non persistance du TreeModel est-elle bien du dans ce cas là au TreeFilter ? ou bien il y a t-il une erreur dans ma méthode d'appel ?

2 est-ce que le fait d'utiliser la méthode on_get_iter() et de fabriquer une référence de ligne interne à partir d'une donnée unique dans mon Treestore et utilisé dans le TreeModel serait bien un moyen de rendre le TreeModel persistant ? et dois-je écrire du code pour le rendre persisant en plus ?

J'ai repris la terminologie du texte du tuto PyGtk paragraphe 14.11.2. Interface du GenericTreeModel
http://python.developpez.com/cours/p...l/php/pygtkfr/

Merci d'avance de votre aide car je n'ai pas encore la maitrise du sujet