Kategória: Python

Zmenené: 28. júl 2011

Zobrazenie stromu zo 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 dátového stromu v prvku gtk.TreeVew.

Cieľ

Majme zoznam prvkov:

data = [
  { 'id': '101', 'parent': '0',   'data': 'data0' },
  { 'id': '102', 'parent': '101', 'data': 'data1' },
  { 'id': '103', 'parent': '0',   'data': 'data2' },
  { 'id': '104', 'parent': '0',   'data': 'data3' },
  { 'id': '105', 'parent': '104', 'data': 'data4' },
  { 'id': '106', 'parent': '105', 'data': 'data5' }
]

a cieľom je, aby bol zobrazený v prvku gtk.TreeView, ktorý slúži na zobrazenie stromovej štruktúry:

Pole v TreeView

Riešenie

  • na uchovávanie stromovej štruktúry nastaviť gtk.TreeStore,
  • vytvoriť gtk.TreeView a priradiť mu TreeStore,
  • prvok TreeView sa postará o zobrazenie štruktúry z TreeStore.

Vzorový kód

import pygtk, gtk, gobject
import pango

def display_table(vbox, data):

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

    # vytvorenie modelu
    model = gtk.TreeStore(gobject.TYPE_LONG,
                          gobject.TYPE_STRING,
                          gobject.TYPE_STRING);                      # pozn. 1

    field_header = ['id', 'title', 'data']

    # Vytvorenie TreeView, na zobrazenie dát
    view = gtk.TreeView(model);                                      # pozn. 2
    scrolled_win.add(view)

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

    # naplnenie dátami
    nodes = {}
    nodes["0"] = None                                                # root
    for item in data:
        id = item['id']
        parent = item['parent']
        data = item['data']
        nodes[id] = model.append(nodes[parent],
                          [ int(id), "this is id %s" % id, data ] )  # pozn. 4

    view.expand_all()

window = gtk.Window()
window.set_size_request(400, 200)

window.connect ('destroy', gtk.main_quit)

vbox = gtk.VBox()
window.add(vbox)

# zobrazený popis
title = gtk.Label("Display a tree structure from array")
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)

data = [
    { 'id': '101', 'parent': '0',   'data': 'data0' },
    { 'id': '102', 'parent': '101', 'data': 'data1' },
    { 'id': '103', 'parent': '0',   'data': 'data2' },
    { 'id': '104', 'parent': '0',   'data': 'data3' },
    { 'id': '105', 'parent': '104', 'data': 'data4' },
    { 'id': '106', 'parent': '105', 'data': 'data5' }
]

display_table(vbox, data)

window.show_all()
gtk.main()

Vysvetlenie

  1. Nastavuje TreeStore na uchovávanie dát. Dáta sú v troch stĺpcoch, prvý je celé číslo, ktoré uchováva ID, druhé a tretie sú reťazce.
  2. Vytvára TreeView. Tu je k TreeView priradený model.
  3. Nastavuje stĺpce TreeView.
  4. Prechádza cez zoznam dát a pripája ich do stromovej štruktúry. Premenná nodes uchováva gtk.TreeIter každého uzla, čo je obdobou ukazovateľa na uzol.