Demo-Programm für Listen

 

Demo-Programm für Listen

Ein einfaches Programm listendemo.py, das die Benutzung der wichtigsten Listen-Bedienelemente demonstriert. Die Benutzeroberfläche wird aus der Datei listendemo.ui geladen.

Quellcode

  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
#!/usr/bin/env python
#-*- coding: utf-8-*-

import gtk
import random

FARBEN=('rot', 'blau', 'grün', 'gelb')



def add_cell_renderer(control, col_no=0, renderer=None, attr='text'):
    if renderer is None:
        renderer=gtk.CellRendererText()
    control.pack_start(renderer, True)
    control.add_attribute(renderer, attr, col_no)
    

def create_treeview_column(widget, title, col_no, renderer=None,
                           attr='text'):
    column = gtk.TreeViewColumn(title)
    widget.append_column(column)
    add_cell_renderer(column, col_no, renderer,  attr)

def set_entry_completion(entry, completion, col_no, renderer=None):
    add_cell_renderer(completion, col_no, renderer)
    entry.set_completion(completion)



class ListenDemo(object):
    def __init__(self):
        self.builder = gtk.Builder()
        self.builder.add_from_file("listendemo.ui")
        self.builder.connect_signals(self)
        
        for i in range(10):
            self.obj('ls_dinge').append((random.randint(1, 10),
                                         random.choice(FARBEN),
                                         'Eintrag %d'%i))

        for farbe in FARBEN:
            self.obj('ls_farben').append((farbe,));

        ## Erzeuge Spalten für TreeView
        create_treeview_column(self.obj('tv_dinge'), 'Anzahl', 0,
                               gtk.CellRendererSpin())

        create_treeview_column(self.obj('tv_dinge'), 'Farbe',  1,
                               gtk.CellRendererText())

        create_treeview_column(self.obj('tv_dinge'), 'Text',  2,
                               gtk.CellRendererText())


        ## ComboBox für die Farbe
        add_cell_renderer(self.obj('cbox_farbe')) 

        ## Vervollständiger für die Texteingabe
        set_entry_completion(self.obj('e_text'), self.obj('ec_text'), 2)
        
        ## Erstes Element der Liste auswählen
        self.obj('tv_dinge').set_cursor(0)


    def obj(self, name):
    	"""
	Gibt Glade-Object 'name' zurück
	"""
        return self.builder.get_object(name)
        

    def run(self):
    	"""
	Startet die zentrale Warteschleife von Gtk
	"""
        try:
            gtk.main()
        except KeyboardInterrupt:
            pass
    

    def quit(self):
    	"""
        Verlässt die zentrale Warteschleife von Gtk

	"""
        gtk.main_quit()

    
    def set_color(self, color):
        """
        Wählt Farbe 'color' in der ComboBox aus
        """
        for (i, row) in  enumerate(self.obj('ls_farben')):
            if row[0]==color: break
        else:
            i=-1
        self.obj('cbox_farbe').set_active(i)


    def get_values(self):
        """
        Gibt die Werte aus den Eingabe-Elementen zurück
        """
        anzahl = self.obj('sb_anzahl').get_value()
        farbe = self.obj('cbox_farbe').get_active_text()
        text =  self.obj('e_text').get_text()
        return anzahl, farbe, text


    def set_values(self, values):
        """
        Setzt die Werte der Eingabe-Elemente
        """
        self.set_color(values[1]);
        self.obj('sb_anzahl').set_value(values[0])
        self.obj('e_text').set_text(values[2])


    def remove_from_list(self, path):
        """
        Entfernt das Elemente mit Pfad 'pfad' aus der Liste
        """
        it = self.obj('ls_dinge').get_iter(path)
        self.obj('ls_dinge').remove(it)
        print path,  len(self.obj('ls_dinge'))
        if not self.obj('ls_dinge').iter_is_valid(it):
            if path[0] > len(self.obj('ls_dinge')):                
                path=(path[0]-1,)
            else:
                self.set_values((0, '',''))
        self.obj('tv_dinge').set_cursor(path)
        

###############################
## Signal-Behandlungsroutinen
###############################

#################
## Hauptfenster

    def on_window1_delete_event(self, *args):
        self.quit()

#############
## Aktionen

    def on_ac_quit_activate(self, action, *args):
        self.quit()

    def on_ac_neu_activate(self, action, *args):
        self.obj('ls_dinge').append((0, 'rot', ''))
        self.obj('tv_dinge').set_cursor(len(self.obj('ls_dinge'))-1)
        
    def on_ac_speichern_activate(self, action, *args):
        path = self.obj('tv_dinge').get_cursor()[0]
        if path is not None: 
            self.obj('ls_dinge')[path] = self.get_values()

    def on_ac_loeschen_activate(self, action, *args):
        path = self.obj('tv_dinge').get_cursor()[0]
        if path is not None: 
            self.remove_from_list(path)

    def on_tv_dinge_cursor_changed(self, action, *args):
        path = self.obj('tv_dinge').get_cursor()[0]
        if path is not None:
            row = self.obj('ls_dinge')[path]
            self.set_values(row)
        




if __name__ == '__main__':
    app = ListenDemo()
    app.run()

Bildschirmfoto

Das Programm erzeugt Fenster mit einer Listenansicht auf der linken Seite und einer Auswahlliste, einem Einstellfeld und Textfeld sowie drei Knöpfen auf der Rechten Seite.

../../../_images/listendemo.png

Beschreibung