File: treeview_advanced_liststore.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 (184 lines) | stat: -rw-r--r-- 7,937 bytes parent folder | download | duplicates (2)
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
<?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_advanced_liststore.py" xml:lang="cs">
  <info>
    <title type="text">Jednoduchý Treeview s ListStore (Python)</title>
    <link type="guide" xref="beginner.py#treeview"/>
    <link type="next" xref="treeview_cellrenderertoggle.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í ListStore (více komplexní příklad)</desc>
  </info>

  <title>Více komplexní Treeview s ListStore</title>
  <media type="image" mime="image/png" src="media/treeview_advanced_liststore.png"/>
  <p>Tento TreeView zobrazuje jednoduchý ListStore s napojeným signálem <code>"changed"</code> (změna výběru).</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

list_of_dvd = [["The Usual Suspects"],
               ["Gilda"],
               ["The Godfather"],
               ["Pulp Fiction"],
               ["Once Upon a Time in the West"],
               ["Rear Window"]]


class MyWindow(Gtk.ApplicationWindow):

    def __init__(self, app):
        Gtk.Window.__init__(self, title="My DVDs", application=app)
        self.set_default_size(250, 100)
        self.set_border_width(10)

        # Datové úložiště v modelu
        # Vytvoří ListStore s jedním sloupcem
        self.listmodel = Gtk.ListStore(str)
        for i in range(len(list_of_dvd)):
            self.listmodel.append(list_of_dvd[i])

        # TreeView pro zobrazení dat uložených v modelu
        view = Gtk.TreeView(model=self.listmodel)

        # Vykreslovač buňky pro první sloupec
        cell = Gtk.CellRendererText()
        # Vytvoří první sloupec
        col = Gtk.TreeViewColumn("Title", cell, text=0)
        # a připojí jej do stromového zobrazení
        view.append_column(col)

        # Když je ve stromovém zobrazení vybrán řádek, vyšle signál
        self.selection = view.get_selection()
        self.selection.connect("changed", self.on_changed)

        # Popisek, který použijeme k zobrazení výběru
        self.label = Gtk.Label()
        self.label.set_text("")

        # Tlačítko pro přidání nového názvu, napojené na funkci zpětného volání
        self.button_add = Gtk.Button(label="Add")
        self.button_add.connect("clicked", self.add_cb)

        # Vstupní pole pro zadávání názvů
        self.entry = Gtk.Entry()

        # Tlačítko pro odstranění názvů, napojené na funkci zpětného volání
        self.button_remove = Gtk.Button(label="Remove")
        self.button_remove.connect("clicked", self.remove_cb)

        # Tlačítko pro odstranění všech názvů, napojené na funkci zpětného volání
        self.button_remove_all = Gtk.Button(label="Remove All")
        self.button_remove_all.connect("clicked", self.remove_all_cb)

        # Mřížka pro připojení widgetů
        grid = Gtk.Grid()
        grid.attach(view, 0, 0, 4, 1)
        grid.attach(self.label, 0, 1, 4, 1)
        grid.attach(self.button_add, 0, 2, 1, 1)
        grid.attach_next_to(
            self.entry, self.button_add, Gtk.PositionType.RIGHT, 1, 1)
        grid.attach_next_to(
            self.button_remove, self.entry, Gtk.PositionType.RIGHT, 1, 1)
        grid.attach_next_to(
            self.button_remove_all, self.button_remove, Gtk.PositionType.RIGHT, 1, 1)

        # Přidá mřížku do okna
        self.add(grid)

    def on_changed(self, selection):
        # Získá model a iterátor, který ukazuje na data v modelu
        (model, iter) = selection.get_selected()
        # Nastaví popisek na novou hodnotu podle výběru, pokud něco
        # vybráno je
        if iter is not None:
            self.label.set_text("\n %s" % (model[iter][0]))
        else:
            self.label.set_text("")
        return True

    # Funkce zpětného volání pro tlačítko "Add"
    def add_cb(self, button):
        # Připojí do modelu názevu, který je ve vstupním poli
        title = self.entry.get_text()
        self.listmodel.append([title])
        # A vypíše zprávu do terminálu
        print("%s has been added" % (title))

    def remove_cb(self, button):
        # Jestliže je v modelu ještě nějaký záznam
        if len(self.listmodel) != 0:
            # Získá výběr
            (model, iter) = self.selection.get_selected()
            # Jestliže je něco vybráno, vypíše zprávu do terminálu
            # a odstraní to z modelu
            if iter is not None:
                print("%s has been removed" % (model[iter][0]))
                self.listmodel.remove(iter)
            # Jinak vyzve uživatele, aby vybral, co chce odstranit
            else:
                print("Select a title to remove")
        # Jinka, když v modelu není žádný záznam, vypíše "Empty list"
        # do terminálu
        else:
            print("Empty list")

    def remove_all_cb(self, button):
        # Jestliže je v modelu ještě nějaký záznam
        if len(self.listmodel) != 0:
            # Odstraní všechny záznamy v modelu
            for i in range(len(self.listmodel)):
                iter = self.listmodel.get_iter(0)
                self.listmodel.remove(iter)
        # Vypíše do terminálu zprávu, že model je teď prázdný
        print("Empty list")


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 36 je signál <code>"changed"</code> napojen na funkci zpětného volání <code>on_changed()</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/GtkListStore.html">GtkListStore</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/GtkTreeViewColumn.html">GtkTreeViewColumn</link></p></item>
      <item><p><link href="https://gitlab.gnome.org/GNOME/pygobject/blob/master/gi/overrides/Gtk.py">pygobject – vazba jazyka Python pro GObject Introspection</link></p></item>
    </list>
  </section>
</page>