Kategória: Python

Zmenené: 28. júl 2011

Zobrazenie 2D zoznamu

Vzorový kód, pôvodne napísaný pre PHP GTK2 (zverejnený v php-gtk2 Cookbook), ktorý som upravil tak, aby fungoval v Pythone. Príklad ukazuje ako zobraziť obsah zoznamu v prvku gtk.TreeView.

Cieľ

Tento článok ukazuje základné nastavenie prvku TreeView, v ktorom bude zobrazený jednoduchý zoznam:

2D pole v prvku TreeView

Riešenie

Štandardným postupom na zobrazenie dát v TreeView je:

  • na uchovávanie dát vytvoriť gtk.ListStore alebo gtk.TreeStore (tu je na uchovanie 2D poľa použitý gtk.ListStore),
  • na zobrazenie dát vytvoriť gtk.TreeView,
  • pre každý stĺpec vytvoriť gtk.TreeViewColumn,
  • každý gtk.TreeViewColumn vyžaduje aspoň jeden spravovač bunky (cell renderer), tu sú použité len reťazce, a tak je použitý len gtk.CellRendererText,
  • naplnenie modelu,
  • aby boli použité posuvníky, je TreeView je zabalený v gtk.ScrolledWindow.

Vzorový kód

import pygtk, gtk, gobject, pango

def display_table(vbox, data):

    # Nastavenie posuvného okna
    scrolled_win = gtk.ScrolledWindow()
    scrolled_win.set_policy( gtk.POLICY_AUTOMATIC,
                             gtk.POLICY_AUTOMATIC)
    vbox.pack_start(scrolled_win)

    # Vytvorenie zoznamu
    model = gtk.ListStore(gobject.TYPE_STRING,
                          gobject.TYPE_STRING,
                          gobject.TYPE_LONG,
                          gobject.TYPE_DOUBLE)                  # note 2

    field_header = ('Row #', 'Description', 'Qty', 'Price')     # note 3

    # vytvorenie TreeView, na zobrazenie zoznamu
    view = gtk.TreeView(model)                                  # note 4
    scrolled_win.add(view)                                      # note 5

    # vytvorenie stĺpcov
    for col in range(0, len(field_header)):
        cell_renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn( field_header[col],
                                     cell_renderer, text=col)
    view.append_column(column)

    # naplnenie dátami
    for row in range(0, len(data)):
        values = []
        for col in range(0, len(data[row])):
            values.append(data[row][col])

        model.append(values)                                    # note 6

window = gtk.Window()
window.set_size_request(400, 200)
window.connect('destroy', gtk.main_quit)
vbox = gtk.VBox()
window.add(vbox)

# titulok
title = gtk.Label("Display 2D Array in GtkTreeView - Part 1")
title.modify_font(pango.FontDescription("Times New Roman Italic 10"))
title.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#0000ff"))
title.set_size_request(-1, 40)
vbox.pack_start(title, 0, 0)
vbox.pack_start(gtk.Label(), 0, 0)

# 2D tabuľka
data = (
        ('row0', 'item 1', 2, 3.1),
        ('row1', 'item 4', 5, 6.21),
        ('row2', 'item 7', 8, 9.36),
        ('row3', 'item 10', 11, 12.4),
        ('row4', 'item 21', 14, 15.5),
        ('row5', 'item 36', 17, 18.6),
        ('row6', 'item 42', 20, 21.73))

display_table(vbox, data)                                       # note 1

window.show_all()
gtk.main()

Vysvetlenie

Dáta sú uchovávané v dátovom modeli (tj. gtk.ListStore alebo gtk.TreeStore) a na ich zobrazenie je potrebné pridať prvok TreeView.

  1. Funkcia, ktorá zjednodušuje zobrazenie 2D poľa v gtk.TreeView.
  2. Vytvára dátový model pomocou gtk.ListStore, ktorý má štyri stĺpce, prvé dva sú textové (gobject.TYPE_STRING), tretí je celé číslo (gobject.TYPE_LONG) a posledný je desatinné číslo (gobject.TYPE_DOUBLE).
  3. Vytvorenie zoznamu s hlavičkami stĺpcov.
  4. Vytvorenie gtk.TreeView, ktorý je napojený na model.
  5. Pridanie TreeView do posuvného okna.
  6. Pomocou funkcie gtk.ListStore.append() sú dáta pridávané do modelu, pričom dáta sú v podobe zoznamu a počet polí zoznamu musí zodpovedať počtu stĺpcov dátového modelu.