File: treeview_advanced_liststore.py.page

package info (click to toggle)
gnome-devel-docs 3.14.1-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 46,300 kB
  • ctags: 630
  • sloc: xml: 2,321; ansic: 2,040; python: 1,807; makefile: 747; sh: 504; cpp: 131
file content (208 lines) | stat: -rw-r--r-- 9,667 bytes parent folder | download
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>