2015-11-23 90 views
1

我想写一个应用程序与女巫树视图小部件我将存储我的类'物品'的对象。如何从GObject类继承?

我知道为了做到这一点,我的'Item'类必须继承GObject类。不幸的是有些事情是错误的,我没有看到我的树上的项目文本。我只得到这个警告:

Warning: unable to set property 'text' of type 'gchararray' from value of type '__main__+Item' 

我需要做什么来解决这个问题?

此示例程序是演示问题,它可以测试修正:

#!/usr/bin/env python3 

from gi.repository import Gtk 
from gi.repository import GObject 


class Item(GObject.GObject): 
    text = GObject.property(type=str, default='item', flags=GObject.PARAM_READWRITE) 

    def __init__(self, title): 
     GObject.GObject.__init__(self) 
     self.__title = title 

    def __str__(self): 
     return self.__title 

GObject.type_register(Item) 


class MainWindow(Gtk.Window): 
    def __init__(self): 
     super().__init__(Gtk.WindowType.TOPLEVEL) 
     self.connect('destroy', self.on_destroy) 
     tree_model = Gtk.TreeStore(Item.__gtype__) 
     # tree_model = Gtk.TreeStore(str) 
     text_renderer = Gtk.CellRendererText() 
     text_column = Gtk.TreeViewColumn(None, text_renderer) 
     text_column.add_attribute(text_renderer, 'text', 0) 
     tree_view = Gtk.TreeView(tree_model) 
     tree_view.append_column(text_column) 
     self.add(tree_view) 
     self.show_all() 
     tree_model.append(None, (Item('test'),)) 
     # tree_model.append(None, ('It works!',)) 

    def on_destroy(self, e): 
     Gtk.main_quit() 


if __name__ == '__main__': 
    MainWindow() 
    Gtk.main() 

回答

1

GtkCellRendererText需要字符串(gchararray)数据的text财产,它接收定制的GObject值。 __str__函数在Python级别上工作,永远不会被GObject调用。

幸运的是,你想要实现的并不需要子类化GObject。你需要做到以下几点:

  • 指定树商店列GObject.TYPE_PYOBJECT。这将允许您将实例附加到树存储,而不需要继承GObject或特殊属性。

  • 在树视图列上使用set_cell_data_func从您存储在模型中的实例中提取文本数据。

查看this answer查看该技术的一个工作示例。