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>
|