带有多个列的GtkTreeView和带有单个自定义类型的GtkListStore(在Python中)

我正在尝试在Gtk.TreeView的不同列上显示对象的属性.说我有以下内容:

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

我想将实例存储在Gtk.ListStore中,如下所示.

store = Gtk.ListStore(MyClass)

现在,在创建Gtk.TreeView时,我不知道如何指定必须呈现2列,一列用于第一个属性,另一列用于age属性.

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

这些帖子(1)(2)在某种程度上解释了如何使用自定义类型,但只使用1列(然后商店中列数的长度与视图中的列数相匹配).我听起来像我想做的事情是一件普通的事情而不需要任何解决方法.也许它是关于对Gtk.ListStore进行子类化以让它告诉视图它有几列以及如何获取每个值?

另外,如何对商店中的MyClass实例进行更改会自动通知并反映在视图中?

最佳答案
您需要做两件事:使用单个TYPE_PYOBJECT列设置ListStore,然后在树视图列上使用set_cell_data_func从相应的对象属性设置单元格文本.

这是一个演示这个的例子:

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()

转载注明原文:带有多个列的GtkTreeView和带有单个自定义类型的GtkListStore(在Python中) - 代码日志