File: treeview_cellrenderertoggle.py.page

package info (click to toggle)
gnome-devel-docs 40.3-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 79,188 kB
  • sloc: javascript: 2,514; xml: 2,407; ansic: 2,229; python: 1,854; makefile: 805; sh: 499; cpp: 131
file content (155 lines) | stat: -rw-r--r-- 7,180 bytes parent folder | download | duplicates (4)
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 &lt; 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>