Zobrazenie stromu zo zoznamu
Kategória: Python
Upravené: štvrtok, 28. júl 2011
Contents
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:

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
#!/usr/bin/env python # -*- coding: utf-8 -*- 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
- 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.
- Vytvára TreeView. Tu je k TreeView priradený model.
- Nastavuje stĺpce TreeView.
- 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.



Komentáre
chodia tu ľudia zo zhruba 200 rôznych IP denne... A nikto nebude písať na email, pretože ten vidím len ja.
V neposlednom rade, považujem takúto výzvu za úbohú (rovnako ako preklepy v komentári), pretože jednak nijako (teda až na ten python) nesúvisí s článkom, a jednak toto nie je portál s pracovnými ponukami!