GTK&x2B;3.0:如何将Gtk.TreeStore与自定义模型项一起使用?

GTK&x2B;3.0:如何将Gtk.TreeStore与自定义模型项一起使用?,gtk,gtk3,pygobject,gobject,gtktreeview,Gtk,Gtk3,Pygobject,Gobject,Gtktreeview,我试图用Python开发一个GTK应用程序,但我一直坚持正确使用。我的主要问题是:我已经解析了一些JSON,我有自己的数据结构,基本上是一个Python列表和两种对象:一种表示项的集合(集合不能嵌套),另一种表示项(可能出现在列表和集合中) 我已经熟悉了TreeStore的基本用法,并成功地将项目正确地呈现在屏幕上。我不知道如何处理treestore只能存储gobject类型这一事实(在这一点上我不确定,因为我不太了解gobject类型系统)。C的文档列出了以下基本类型(PixBuf除外),这些

我试图用Python开发一个GTK应用程序,但我一直坚持正确使用。我的主要问题是:我已经解析了一些JSON,我有自己的数据结构,基本上是一个Python列表和两种对象:一种表示项的集合(集合不能嵌套),另一种表示项(可能出现在列表和集合中)

我已经熟悉了
TreeStore
的基本用法,并成功地将项目正确地呈现在屏幕上。我不知道如何处理treestore只能存储gobject类型这一事实(在这一点上我不确定,因为我不太了解gobject类型系统)。C的文档列出了以下基本类型(PixBuf除外),这些基本类型可以插入并自动映射到Python数据类型:

例如,gtk_tree_store_new(3,G_TYPE_INT,G_TYPE_STRING,GDK_TYPE_PIXBUF);将创建一个新的GtkTreeStore,其中包含三列,分别为int、string和GdkPixbuf类型

此外,它还说,您可以插入任何。文件中的链接直接指向本段:

表示已注册类型的唯一标识符的数值

我对这个主题的研究到此结束,Google发现大部分是GTK 2.x教程,除了插入
str
int
等数据类型之外,没有其他数据类型的内容。
问题:

  • 是否可以实现一个新的GType(或任何其他可以在树存储库中插入自定义数据的接口)以及如何实现它?
    我已经尝试从
    GObject
    派生,但没有任何帮助

  • 如何避免同时保留两个数据结构?
    即我的解析结果和树存储中的重复信息

  • 如何处理混合内容?
    在我的例子中,我有具有不同附加信息的集合和项(它们在树视图中镜像为具有或不具有子节点的节点)

如果上述问题得到解决,我在处理选择时也会解决这个问题:很难匹配像
str
int
这样的简单类型来匹配我之前插入的项目。这样的属性必须是一个键,您仍然需要使用解析结果搜索列表,这是无效的

提前谢谢你

与问题无直接关系的其他信息:


我认为实现一个定制的
TreeModel
可能是一个可行的挑战,直到我在一篇:

然而,所有这些都是有代价的:除非去掉所有换行符,否则不太可能在不到1000行的时间内编写有用的自定义模型。编写自定义模型并不像听起来那么困难,而且很值得付出努力,尤其是因为如果您有大量数据需要跟踪,那么编写自定义模型将产生更明智的代码

这仍然有效吗



我刚发现这有帮助吗?为PyGTK 2.0提供了尽可能多的资源。已弃用。

问题已解决!对于遇到相同问题的其他人,我将积累一些有用的资源和示例代码。如果你知道怎么做没关系,但事实上这是没有记录的

  • 正确地从具有属性的
    GObject
    派生:

  • 如何欺骗TreeView接受
    CellRenderText
    的自定义值,包括用于实现传递给
    set\u cell\u data\u func
    的函数的有用片段(需要针对
    TreeView
    进行调整)

  • 关于TreeView的通用良好文档

完整的示例代码,用于在树状视图中填充人员并在按钮单击上打印所选人员:

从gi.repository导入Gtk
从gi.repository导入GObject
班级成员(GObject.GObject):
name=GObject.property(type=str)
age=GObject.property(type=int)
gender=GObject.property(type=bool,default=True)
定义初始化(自):
GObject.GObject.\uuuu init\uuuuu(self)
定义报告(自我):
s=无
如果self.get_属性(“性别”):s=“m”
其他:s=“f”
返回“%s,%s,%i”%(self.get\u属性(“名称”)、s、self.get\u属性(“年龄”))
类MyApplication(Gtk.Window):
定义初始化(self,*args,**kwargs):
Gtk.Window.uuu init_uuuu(self,*args,**kwargs)
self.set_标题(“树显示”)
自我设置大小请求(400400)
自我连接(“销毁”,Gtk.main_退出)
self.create_widgets()
self.insert_行()
self.show_all()
def创建_小部件(自):
self.treestore=Gtk.treestore(个人)
self.treeview=Gtk.treeview()
self.treeview.set_模型(self.treestore)
列=Gtk.TreeView列(“人”)
cell=Gtk.cellRenderText()
column.pack_start(单元格,True)
column.set\u cell\u data\u func(cell,self.get\u name)
self.treeview.append_列(列)
vbox=Gtk.vbox()
self.add(vbox)
vbox.pack_start(self.treeview,True,True,0)
按钮=Gtk.按钮(“检索元素”)
按钮连接(“点击”,自我检索元素)
vbox.pack_start(按钮、假、假、5)
def get_名称(自身、列、单元、模型、iter、数据):
cell.set_属性('text',self.treestore.get_值(iter,0).name)
def插入_行(自身):
姓名、年龄、性别[(“汤姆”,19岁,对)、(“安娜”,35岁,错)]:
p=人()
p、 name=name
p、 年龄=年龄
p、 性别=性别
self.treestore.append(无,(p,))
def检索_元素(自身、小部件):
模型,treeiter=self.treeview.get_selection().get_selected()
如果是treeiter:
打印“您选择的”,型号[treeiter][