[Python-de] pygtk mit TreeView

Volker Helm helm.volker at gmx.de
Die Apr 26 23:49:23 CEST 2005


Hi,

>>ich versuche gerade eine Routine unter pygtk zu schreiben, die den
>>Inhalt von Datenbankabfragen in einem ListStore schreibt an anschließend
>>anzeigt.
>>
>>So wie ich es verstanden habe, kann ListStore nicht dynamisch erstellt
>>werden, sondern muss zum Zeitpunkt der Laufzeit kodiert sein. Einzige
>>Alternative liegt darin, selbstständig ein Modell zu generieren und
>>dieses dann dem Objekt gtk.TreeView zuzuweisen.
>>
> 
> Was meinst du mit "dynamisch erstellen"?

Darunter verstehe ich, dass ein Select auf Datenbanktabellen nicht immer
die gleiche Strukturen wiedergibt. Z.B. die Abfrage auf eine
Schauspielertabelle ergibt andere Felder (Werte, Datentypen und
Reihenfolgen) als die Abfrage auf eine Tabelle mit Filmtiteln.

Nachdem eine solche Abfrage an die Datenbank gesendet wurde und mittels
cur.execute("""select blah, blubb from schauspieler""") die
Tabellenköpfe (cur.description) ausgelesen wurde, möchte ich das
Datenmodell aufbauen, in dem dann die Daten eingetragen werden.

Leider habe ich die Dokumentation (Tutorial) so verstanden, dass bei
gtk.ListStore die Datenstruktur fest definiert sein muss. Leider habe
ich keine Ahnung, wie ich eine, nach der Datenbankabfrage, dynamisch
generierte Struktur gtk.ListStore übergeben kann. Tuples, List und
Strings hat er bisher abgelehnt.


> Da ich deine Mail nicht so ganz verstehe, beschreib ich einfach mal, wie
> ich's mache.
> Ich design das GUI mit glade. Somit ist ein gtk.TreeView vorhanden.

Auch wenn ich Glade bisher nicht nutze, verstehe ich es bis hierher.

> Im Python Skript erstell ich dann das passende gtk.ListStore dazu:
> 
> <code>
> 	self.liststore = gtk.ListStore(gobject.TYPE_STRING)
>         self.treeview = self.tree_window.get_widget("treeview")
>         self.treeview.set_model(self.liststore)
> 
>         renderer = gtk.CellRendererText()
>         column = gtk.TreeViewColumn("Eine Spalte", renderer, text=0)
> 
>         self.treeview.append_column(column)
> </code>

Gut, damit habe ich die erste Spalte definiert. Leider muss ich
Strukturen des Datenmodell anhand der Datenbankabfrage anpassen.

Z.B. für Schauspieler:
<code>
  self.liststore = gtk.ListStore(gobject.TYPE_STRING,
                    gobject.TYPE_STRING,gobject.TYPE_INT)
  self.treeview = gtk.TreeView(self.liststore)

  spalte = gtk.TreeView("Vorname",gtk.CellRendererText(),text=0)
  self.treeview.append_column(spalte)
  spalte = gtk.TreeView("Name",gtk.CellRendererText(),text=1)
  self.treeview.append_column(spalte)
  spalte = gtk.TreeView("Alter",gtk.CellRendererText(),text=2)
  self.treeview.append_column(spalte)

  data = [['Ethan','Hawks',30],['Ashley','Judd','31']]

  [self.liststore.append(data[i]) for i in range(len(data))]
</code>

Bei Filmtiteln wird das Datenmodell eher aussehen wie
gtk.ListStore(str,int,str,int)
# Titel, Länge, Medium(DVD,Video etc.), Freigabealter

> Einen Eintrag kannst du dann wie folgt einfügen:
> 
> <code>
> iter = self.liststore.append(['Text in der Spalte'])
> </code>
Du meinst sicherlich, dass damit eine neue Zeile angefügt wird, aber
nicht eine neue Spalte. Ich wollte verhindern, dass ich mir ein eigenes
Modell für zusammenstellen muss (bin noch nicht so tief in GTK). Deshalb
hoffte ich, beim Aufbau des Modells für gtk.ListStore die Parameter
(str,int,gboolean etc) dynamisch zu jedem Aufruf generieren zu können.
Die Daten können dann schnell mittels self.liststore.append(Daten)
angehängt werden.

Ich hoffe, diesmal habe ich mich verständlicher ausgedrückt.

Bye,

Volker

PS: Weiß einer ein gutes Tutorial für Glade mit python und pygtk?