GtkTreeView con varias columnas y GtkListStore con un solo tipo personalizado (en Python)

Estoy intentando mostrar las propiedades de un objeto en diferentes columnas de un Gtk.TreeView . Digamos que tengo lo siguiente:

 class MyClass(GObject.GObject): def __init__(self, first, last, age): self.first = first self.last = last self.age = age 

Y quiero almacenar instancias en un Gtk.ListStore como se muestra a continuación.

 store = Gtk.ListStore(MyClass) 

Ahora, al crear el Gtk.TreeView , no sé cómo especificar que se deben representar 2 columnas, una para la first propiedad y la otra para la propiedad age .

 view = Gtk.TreeView(model=store) # Columns for first and age added here ... 

Estas publicaciones (1) y (2) explican de alguna manera cómo usar tipos personalizados, pero solo usan 1 columna (entonces la longitud del número de columnas en la store coincide con el número de columnas en la view ). Parece que lo que estoy tratando de hacer sería algo común sin necesidad de ninguna solución. ¿Quizás se trata de sub-clasificar Gtk.ListStore para que diga a la view que tiene varias columnas y cómo obtener cada valor?

Además, ¿cómo hago para que los cambios en las instancias de MyClass en la store se notifiquen automáticamente y se reflejen en la view ?

TYPE_PYOBJECT hacer dos cosas: configurar un ListStore con una sola columna TYPE_PYOBJECT y luego usar un set_cell_data_func en las columnas de la vista de árbol para establecer el texto de la celda a partir de los atributos de objeto apropiados.

Aquí hay un ejemplo que demuestra esto:

 from gi.repository import Gtk, GObject class MyClass(object): def __init__(self, first, last, age): self.first = first self.last = last self.age = age tree_store = Gtk.ListStore(GObject.TYPE_PYOBJECT) tree_store.append([MyClass("foo", "bar", 15)]) tree_store.append([MyClass("baz", "qux", 100)]) def make_column(caption, getter): rend = Gtk.CellRendererText() col = Gtk.TreeViewColumn(caption, rend) def _set_cell_text(column, cell, model, it, ignored): obj = model.get_value(it, 0) cell.set_property('text', getter(obj)) col.set_cell_data_func(rend, _set_cell_text) return col view = Gtk.TreeView(tree_store) view.append_column(make_column("First", lambda obj: obj.first)) view.append_column(make_column("Last", lambda obj: obj.last)) view.append_column(make_column("Age", lambda obj: '%d' % obj.age)) w = Gtk.Window() w.add(view) w.show_all() Gtk.main()