我想用树视图小部件编写应用程序,我将存储类“Item”的对象。
我知道要做到这一点,我的“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()发布于 2015-11-24 10:17:51
GtkCellRendererText的text属性需要字符串(gchararray)数据,并且它正在接收自定义的GObject值。__str__函数在Python级别上工作,从来不被GObject调用。
幸运的是,您想要实现的不需要子类GObject。您需要执行以下操作:
GObject.TYPE_PYOBJECT。这将允许您将实例附加到树存储中,而无需继承GObject或特殊属性。set_cell_data_func从存储在模型中的实例中提取文本数据。有关此技术的工作示例,请参见this answer。
https://stackoverflow.com/questions/33875497
复制相似问题