gpt4 book ai didi

python - 具有多列的 GtkTreeView 和具有单一自定义类型的 GtkListStore(在 Python 中)

转载 作者:行者123 更新时间:2023-12-04 19:06:42 26 4
gpt4 key购买 nike

我试图在 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 列,其中一列用于 first属性(property)和其他为 age属性(property)。
view = Gtk.TreeView(model=store)
# Columns for first and age added here
...

这些帖子 (1)(2)稍微解释一下如何使用自定义类型,但只使用 1 列(那么 store 中的列数长度与 view 中的列数匹配)。我听起来像我正在尝试做的事情是一件很常见的事情,不需要任何解决方法。也许是关于子分类 Gtk.ListStore让它告诉 view它有几列以及如何获取每个值?

另外,我该如何更改 store 中的 MyClass 实例?会自动通知并反射(reflect)在 view 上?

最佳答案

你需要做两件事:设置一个ListStore带单TYPE_PYOBJECT列,然后使用 set_cell_data_func在树 View 列上从适当的对象属性设置单元格文本。

下面是一个演示这一点的示例:

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

关于python - 具有多列的 GtkTreeView 和具有单一自定义类型的 GtkListStore(在 Python 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com