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
|
<?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="cs">
<info>
<title type="text">TreeView s 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>TreeView zobrazující TreeStore (více komplexní příklad s CellRendererToggle)</desc>
</info>
<title>Více komplexní TreeView s TreeStore</title>
<media type="image" mime="image/png" src="media/treeview_cellrenderertoggle.png"/>
<p>Tento widget <code>TreeView</code> zobrazuje <code>TreeStore</code> se dvěma sloupci, z nichž jeden je vykreslován jako přepínač.</p>
<links type="section"/>
<section id="code">
<title>Kód použitý k vygenerování tohoto příkladu</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)
# Data jsou uložena v modelu
# Vytvoří stromové zobrazení se dvěma sloupci
self.store = Gtk.TreeStore(str, bool)
# Naplní model
for i in range(len(books)):
# Iterátor piter je vrácen, kdy se připojuje autor v prvním sloupci
# a hodnota False ve druhém sloupci
piter = self.store.append(None, [books[i][0], False])
# Připojí knihy a přidruženou pravdivostní hodnotu jako potomky
# autora
j = 1
while j < len(books[i]):
self.store.append(piter, books[i][j])
j += 1
# TreeView zobrazuje model
# Vytvoří stromové zobrazení na modelu self.store
view = Gtk.TreeView()
view.set_model(self.store)
# Vykreslovač pro první sloupec - text
renderer_books = Gtk.CellRendererText()
# Vytvoří první sloupec
column_books = Gtk.TreeViewColumn("Books", renderer_books, text=0)
# A připojí jej do stromového zobrazení
view.append_column(column_books)
# Vykreslovat pro druhý sloupec - pravdivostní hodnota jako přepínač
renderer_in_out = Gtk.CellRendererToggle()
# Vytvoří druhý sloupec
column_in_out = Gtk.TreeViewColumn("Out?", renderer_in_out, active=1)
# A připojí jej do stromového zobrazení
view.append_column(column_in_out)
# Napojí signál "toggled" na funkci zpětného volání
renderer_in_out.connect("toggled", self.on_toggled)
# Přidá stromové zobrazení do okna
self.add(view)
# Funkce zpětného volání pro signál vyslaný od CellRendererToggle
def on_toggled(self, widget, path):
# Pravdivostní hodnota vybraného řádku
current_value = self.store[path][1]
# Změní pravdivostní hodnotu vybraného řádku v modelu
self.store[path][1] = not current_value
# Nová aktuální hodnota!
current_value = not current_value
# Jestliže je délka cesty 1 (tj. je vybrán autor)
if len(path) == 1:
# Získá iterátor patřící cestě
piter = self.store.get_iter(path)
# Získá iterátor patřící jejímu prvnímu potomkovi
citer = self.store.iter_children(piter)
# Dokud existují potomoci, mění stav jejich pravdivostních hodnot
# na hodnotu u autora
while citer is not None:
self.store[citer][1] = current_value
citer = self.store.iter_next(citer)
# Jestliže délka cesty naní 1 (tj. je vybrána kniha)
elif len(path) != 1:
# Získá prvního potomka od rodiče knihy (první kniha autora)
citer = self.store.get_iter(path)
piter = self.store.iter_parent(citer)
citer = self.store.iter_children(piter)
# Zkontroluje, jestli jsou vybráni všichni potomci
all_selected = True
while citer is not None:
if self.store[citer][1] == False:
all_selected = False
break
citer = self.store.iter_next(citer)
# Pokud ano, je vybrán i autor, jinak ne
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>Užitečné metody pro widget TreeView</title>
<p>Widget <code>TreeView</code> je navrže okolo návrhu <em>Model/Zobrazení/Ovládání</em>: <em>Model</em> uchovává data, <em>Zobrazení</em> získává upozornění a zobrazuje obsah modelu a konečně <em>Ovládání</em> změní stav modelu a upozorňuje zobrazení na tyto změny. Podrobnější informace a seznam užitečných metod pro stromové zobrazení najdete v <link xref="model-view-controller.py"/>.</p>
<p>Na řádku 48 je signál <code>"toggled"</code> napojen na funkci zpětného volání <code>on_toggled()</code> pomocí <code><var>widget</var>.connect(<var>signál</var>, <var>funkce zpětného volání</var>)</code>. Podrobnější vysvětlení viz <link xref="signals-callbacks.py"/>.</p>
</section>
<section id="references">
<title>Odkazy k API</title>
<p>V této ukázce se používá následující:</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>
|