Dedinčan odporúča...

logoBlender je slobodná, otvorená sada pre tvorenie 3D obsahu, dostupná pre všetky hlavné operačné systémy, pod GNU General Public License.

Zobrazenie stromu zo zoznamu

Kategória: Python
Upravené: štvrtok, 28. júl 2011

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

  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.

Komentáre  

 
# hrabovecky Peter 03. 12. 2011; 16:53
Neviem, ci tu esteniektochodi, ale ak ano prosim odpiste mi na maila tyka sa to python, ak mate cas potreboval by som pomoct a urcite nie zadarmo, lebo uz si s tymneviem dat rady :D
Odpovedať | Odpovedať citáciou | Citovať
 
 
# Slavko 03. 12. 2011; 18:52
Citácia:
Neviem, ci tu esteniektochodi

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!
Odpovedať | Odpovedať citáciou | Citovať
 

Copyright © 2008 - 2012 Sprievodca dedinčana... Niektoré práva vyhradené.
Ak nie je uvedené inak, obsah podlieha licencii „Creative Commons Uveďte autora – Zachovajte licenciu 3.0 Unported

Nenasledovať tento odkaz, inak budete maž zakázaný prístup na stránku!