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
|
<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="treeview_cellrenderertoggle.py" xml:lang="fr">
<info>
<title type="text">TreeView with TreeStore (Python)</title>
<link type="guide" xref="beginner.py#treeview"/>
<link type="next" xref="widget_drawing.py"/>
<revision version="0.1" date="2012-06-30" status="draft"/>
<credit type="author copyright">
<name>Marta Maria Casetti</name>
<email its:translate="no">mmcasetti@gmail.com</email>
<years>2012</years>
</credit>
<desc>Une TreeView affichant un TreeStore (exemple plus complexe avec CellRendererToggle)</desc>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Luc Rebert,</mal:name>
<mal:email>traduc@rebert.name</mal:email>
<mal:years>2011</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Alain Lojewski,</mal:name>
<mal:email>allomervan@gmail.com</mal:email>
<mal:years>2011-2012</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Luc Pionchon</mal:name>
<mal:email>pionchon.luc@gmail.com</mal:email>
<mal:years>2011</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Bruno Brouard</mal:name>
<mal:email>annoa.b@gmail.com</mal:email>
<mal:years>2011-12</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Luis Menina</mal:name>
<mal:email>liberforce@freeside.fr</mal:email>
<mal:years>2014</mal:years>
</mal:credit>
</info>
<title>More Complex TreeView with TreeStore</title>
<media type="image" mime="image/png" src="media/treeview_cellrenderertoggle.png"/>
<p>Ce TreeView affiche un TreeStore de deux colonnes, dont l'une est affichée sous la forme d'un inverseur.</p>
<links type="section"/>
<section id="code">
<title>Code utilisé pour générer cet exemple</title>
<code mime="text/x-python" style="numbered">from gi.repository import Gtk
from gi.repository import Pango
import sys
books = [["Tolstoy, Leo", ["War and Peace", True], ["Anna Karenina", False]],
["Shakespeare, William", ["Hamlet", False],
["Macbeth", True], ["Othello", False]],
["Tolkien, J.R.R.", ["The Lord of the Rings", False]]]
class MyWindow(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.Window.__init__(self, title="Library", application=app)
self.set_default_size(250, 100)
self.set_border_width(10)
# the data are stored in the model
# create a treestore with two columns
self.store = Gtk.TreeStore(str, bool)
# fill in the model
for i in range(len(books)):
# the iter piter is returned when appending the author in the first column
# and False in the second
piter = self.store.append(None, [books[i][0], False])
# append the books and the associated boolean value as children of
# the author
j = 1
while j < len(books[i]):
self.store.append(piter, books[i][j])
j += 1
# the treeview shows the model
# create a treeview on the model self.store
view = Gtk.TreeView()
view.set_model(self.store)
# the cellrenderer for the first column - text
renderer_books = Gtk.CellRendererText()
# the first column is created
column_books = Gtk.TreeViewColumn("Books", renderer_books, text=0)
# and it is appended to the treeview
view.append_column(column_books)
# the cellrenderer for the second column - boolean rendered as a toggle
renderer_in_out = Gtk.CellRendererToggle()
# the second column is created
column_in_out = Gtk.TreeViewColumn("Out?", renderer_in_out, active=1)
# and it is appended to the treeview
view.append_column(column_in_out)
# connect the cellrenderertoggle with a callback function
renderer_in_out.connect("toggled", self.on_toggled)
# add the treeview to the window
self.add(view)
# callback function for the signal emitted by the cellrenderertoggle
def on_toggled(self, widget, path):
# the boolean value of the selected row
current_value = self.store[path][1]
# change the boolean value of the selected row in the model
self.store[path][1] = not current_value
# new current value!
current_value = not current_value
# if length of the path is 1 (that is, if we are selecting an author)
if len(path) == 1:
# get the iter associated with the path
piter = self.store.get_iter(path)
# get the iter associated with its first child
citer = self.store.iter_children(piter)
# while there are children, change the state of their boolean value
# to the value of the author
while citer is not None:
self.store[citer][1] = current_value
citer = self.store.iter_next(citer)
# if the length of the path is not 1 (that is, if we are selecting a
# book)
elif len(path) != 1:
# get the first child of the parent of the book (the first book of
# the author)
citer = self.store.get_iter(path)
piter = self.store.iter_parent(citer)
citer = self.store.iter_children(piter)
# check if all the children are selected
all_selected = True
while citer is not None:
if self.store[citer][1] == False:
all_selected = False
break
citer = self.store.iter_next(citer)
# if they do, the author as well is selected; otherwise it is not
self.store[piter][1] = all_selected
class MyApplication(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
win = MyWindow(self)
win.show_all()
def do_startup(self):
Gtk.Application.do_startup(self)
app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
</code>
</section>
<section id="methods">
<title>Méthodes utiles pour un élément graphique TreeView</title>
<p>The TreeView widget is designed around a <em>Model/View/Controller</em> design: the <em>Model</em> stores the data; the <em>View</em> gets change notifications and displays the content of the model; the <em>Controller</em>, finally, changes the state of the model and notifies the view of these changes. For more information and for a list of useful methods for TreeModel see <link xref="model-view-controller.py"/>.</p>
<p>In line 48 the <code>"toggled"</code> signal is connected to the callback function <code>on_toggled()</code> using <code><var>widget</var>.connect(<var>signal</var>, <var>callback function</var>)</code>. See <link xref="signals-callbacks.py"/> for a more detailed explanation.</p>
</section>
<section id="references">
<title>Références API</title>
<p>Dans cet exemple, les éléments suivants sont utilisés :</p>
<list>
<item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeView.html">GtkTreeView</link></p></item>
<item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeModel.html">GtkTreeModel</link></p></item>
<item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeStore.html">GtkTreeStore</link></p></item>
<item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkCellRendererText.html">GtkCellRendererText</link></p></item>
<item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkCellRendererToggle.html">GtkCellRendererToggle</link></p></item>
<item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeViewColumn.html">GtkTreeViewColumn</link></p></item>
</list>
</section>
</page>
|