jpc*_*cgt 5 python gtk pygtk gtk3
我正在尝试在a的不同列上显示对象的属性Gtk.TreeView.说我有以下内容:
class MyClass(GObject.GObject):
def __init__(self, first, last, age):
self.first = first
self.last = last
self.age = age
Run Code Online (Sandbox Code Playgroud)
我想将实例存储在Gtk.ListStore如下所示的a中.
store = Gtk.ListStore(MyClass)
Run Code Online (Sandbox Code Playgroud)
现在,在创建时Gtk.TreeView,我不知道如何指定必须呈现2列,一个用于first属性,另一个用于age属性.
view = Gtk.TreeView(model=store)
# Columns for first and age added here
...
Run Code Online (Sandbox Code Playgroud)
这些帖子(1)和(2)在某种程度上解释了如何使用自定义类型,但只使用1列(然后store匹配列数的长度与列中的列数view).我听起来像我想做的事情是一件普通的事情而不需要任何解决方法.也许它是关于子类化Gtk.ListStore让它告诉view它有几列以及如何获取每个值?
另外,我如何制作以便对MyClass实例中的更改进行store自动通知并反映在view?
您需要做两件事:ListStore使用单个TYPE_PYOBJECT列设置a ,然后set_cell_data_func在树视图列上使用a 从相应的对象属性设置单元格文本.
这是一个演示这个的例子:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |