[Python-de] GTK -> Liststore -> Treeview: klick

Mathias Uebel mathias.uebel at meeloon.de
Fr Mai 30 12:14:22 UTC 2008


Diez B. Roggisch schrieb:

Hallo Diez, Hallo Volker,

> Die Loesung sieht dann denke ich anders aus - du musst zB von
> 
> gtk.GenericTreeModel
> 
> http://www.pygtk.org/docs/pygtk/class-pygtkgenerictreemodel.html
> http://www.pygtk.org/pygtk2tutorial/sec-GenericTreeModel.html
> 
> ableiten. Als Grundlage dient dann eben die Liste deiner eigenen Objekte.
> 
Die Lösung habe ich aus einem Forum. Dort habe ich das Thema auch 
diskutiert. Ein GTk-Profi hat mir geholfen: Es muss wirklich ein anders 
TreeModel mit ins Boot.

Vielen Dank für eure Hilfe
Mathias

Aber seht selbst:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, time
import pygtk
pygtk.require('2.0')
import gtk, gobject

print """1. Klick auf 'berta'.
2. Sortiere nach Nummer, bis sich die Reihenfolge der Liste veraendert.
3. Klick wieder auf berta.
"""

class MainWin:
	def __init__(self):
		self.myWindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.myListstore = gtk.ListStore(str, str)
		# hier wird das TreeModelSort initialisiert !!!!!
		self.treeview = gtk.TreeView(gtk.TreeModelSort(self.myListstore))
		self.treeview.connect("row-activated", self.Call_ListClick)
		
		col = {
			0:['Time',0],
			1:['Title',1]}
			
		for key, val in col.iteritems():
			tvcolumn = gtk.TreeViewColumn(val[0])
			self.treeview.append_column(tvcolumn)
			cell = gtk.CellRendererText()
			tvcolumn.pack_start(cell, True)
			tvcolumn.set_attributes(cell, text=val[1])
			tvcolumn.set_sort_column_id(key)

		self.data = [['a','anton'],
				['b','berta'],
				['c','conrad'],
				['d','dora'],
				['e','emil']]
		
		for i in self.data:
			item = self.myListstore.append(i)

		self.myWindow.add(self.treeview)
		self.myWindow.show_all()

	def Call_ListClick(self, *args):
		selection = self.treeview.get_selection()
		if selection.get_mode() == gtk.SELECTION_SINGLE:
			model, iter = selection.get_selected()

			print "der index beim ersten mal: %s" % 
model.get_model().get_path(model.convert_iter_to_child_iter(None, iter))
			print "der index nach dem sortieren: %s" % model.get_path(iter)
		
		return 0

if __name__ == "__main__":
	# make a window with list
	Win = MainWin()
	gtk.main()