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 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
|
<?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="el">
<info>
<title type="text">Απλή προβολή οθόνης (Treeview) με αποθήκευση καταλόγου (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 που εμφανίζει μια TreeStore (πιο σύνθετο παράδειγμα)</desc>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Ελληνική μεταφραστική ομάδα GNOME</mal:name>
<mal:email>team@gnome.gr</mal:email>
<mal:years>2012-2014</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Δημήτρης Σπίγγος</mal:name>
<mal:email>dmtrs32@gmail.com</mal:email>
<mal:years>2012, 2013</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Μαρία Θουκιδίδου</mal:name>
<mal:email>marablack3@gmail.com</mal:email>
<mal:years>2014</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Θάνος Τρυφωνίδης</mal:name>
<mal:email>tomtryf@gmail.com</mal:email>
<mal:years>2014</mal:years>
</mal:credit>
</info>
<title>Πιο σύνθετη προβολή δένδρου με ListStore</title>
<media type="image" mime="image/png" src="media/treeview_advanced_liststore.png"/>
<p>Αυτή η TreeView εμφανίζει μια απλή ListStore με το συνδεμένο σήμα επιλογής "αλλαγμένο".</p>
<links type="section"/>
<section id="code">
<title>Ο χρησιμοποιούμενος κώδικας για παραγωγή αυτού παραδείγματος</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)
# the data are stored in the model
# create a liststore with one column
self.listmodel = Gtk.ListStore(str)
for i in range(len(list_of_dvd)):
self.listmodel.append(list_of_dvd[i])
# a treeview to see the data stored in the model
view = Gtk.TreeView(model=self.listmodel)
# cellrenderer for the first column
cell = Gtk.CellRendererText()
# the first column is created
col = Gtk.TreeViewColumn("Title", cell, text=0)
# and it is appended to the treeview
view.append_column(col)
# when a row of the treeview is selected, it emits a signal
self.selection = view.get_selection()
self.selection.connect("changed", self.on_changed)
# the label we use to show the selection
self.label = Gtk.Label()
self.label.set_text("")
# a button to add new titles, connected to a callback function
self.button_add = Gtk.Button(label="Add")
self.button_add.connect("clicked", self.add_cb)
# an entry to enter titles
self.entry = Gtk.Entry()
# a button to remove titles, connected to a callback function
self.button_remove = Gtk.Button(label="Remove")
self.button_remove.connect("clicked", self.remove_cb)
# a button to remove all titles, connected to a callback function
self.button_remove_all = Gtk.Button(label="Remove All")
self.button_remove_all.connect("clicked", self.remove_all_cb)
# a grid to attach the widgets
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)
# add the grid to the window
self.add(grid)
def on_changed(self, selection):
# get the model and the iterator that points at the data in the model
(model, iter) = selection.get_selected()
# set the label to a new value depending on the selection, if there is
# one
if iter is not None:
self.label.set_text("\n %s" % (model[iter][0]))
else:
self.label.set_text("")
return True
# callback function for the "Add" button
def add_cb(self, button):
# append to the model the title that is in the entry
title = self.entry.get_text()
self.listmodel.append([title])
# and print a message in the terminal
print "%s has been added" % (title)
def remove_cb(self, button):
# if there is still an entry in the model
if len(self.listmodel) != 0:
# get the selection
(model, iter) = self.selection.get_selected()
# if there is a selection, print a message in the terminal
# and remove it from the model
if iter is not None:
print "%s has been removed" % (model[iter][0])
self.listmodel.remove(iter)
# otherwise, ask the user to select something to remove
else:
print "Select a title to remove"
# else, if there are no entries in the model, print "Empty list"
# in the terminal
else:
print "Empty list"
def remove_all_cb(self, button):
# if there is still an entry in the model
if len(self.listmodel) != 0:
# remove all the entries in the model
for i in range(len(self.listmodel)):
iter = self.listmodel.get_iter(0)
self.listmodel.remove(iter)
# print a message in the terminal alerting that the model is empty
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>Χρήσιμες μέθοδοι για ένα γραφικό στοιχείο TreeView</title>
<p>Το γραφικό στοιχείο TreeView σχεδιάστηκε γύρω από ένα σχέδιο <em>προτύπου/προβολής/ελεγκτή</em>: το <em>πρότυπο</em> αποθηκεύει τα δεδομένα· η <em>Προβολή</em> παίρνει ειδοποιήσεις αλλαγής και εμφανίζει το περιεχόμενο του προτύπου· ο <em>ελεγκτής</em>, τελικά, αλλάζει την κατάσταση του προτύπου και ειδοποιεί την προβολή για αυτές τις αλλαγές. Για περισσότερες πληροφορίες και για μια λίστα χρήσιμων μεθόδων για λίστα TreeModel, δείτε <link xref="model-view-controller.py"/>.</p>
<p>Στη γραμμή 36 το σήμα <code>"changed"</code> συνδέεται με τη συνάρτηση επανάκλησης <code>on_changed()</code> χρησιμοποιώντας <code><var>widget</var>.connect(<var>signal</var>, <var>callback function</var>)</code>. Δείτε <link xref="signals-callbacks.py"/> για μια πιο λεπτομερή εξήγηση.</p>
</section>
<section id="references">
<title>Αναφορές API</title>
<p>Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:</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="http://git.gnome.org/browse/pygobject/tree/gi/overrides/Gtk.py">pygobject - δεσμεύσεις Python για αυτοέλεγχο GObject</link></p></item>
</list>
</section>
</page>
|