gpt4 book ai didi

GTK+ 3.0 : How to use a Gtk. 带有自定义模型项目的 TreeStore?

转载 作者:行者123 更新时间:2023-12-04 13:33:41 25 4
gpt4 key购买 nike

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

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

As an example, gtk_tree_store_new (3, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF); will create a new GtkTreeStore with three columns, of type int, string and GdkPixbuf respectively.



此外,它说您可以插入任何 GType .文档中的链接直接指向本段:

A numerical value which represents the unique identifier of a registered type.



我对该主题的研究到此结束,Google 发现大部分是 GTK 2.x 教程,除了 str 之外没有插入其他数据类型。和 int等等
问题:
  • 是否可以实现新的 GType(或任何其他可以在树存储中插入自定义数据的接口(interface))以及如何实现?
    我已经尝试从 GObject 派生但这没有帮助。
  • 如何摆脱同时保留两个数据结构?
    即我的解析结果和 Treestore 中的重复信息。
  • 如何处理混合内容?
    就我而言,我有具有不同附加信息的集合和项目(在 TreeView 中镜像为有或没有子节点的节点)。

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

    先感谢您!

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

    我认为实现自定义 TreeModel 可能是一个可行的挑战。直到我在 tutorial for GTK 2 中读到此内容:

    However, all this comes at a cost: you are unlikely to write a useful custom model in less than a thousand lines, unless you strip all newline characters. Writing a custom model is not as difficult as it might sound though, and it may well be worth the effort, not least because it will result in much saner code if you have a lot of data to keep track of.



    这仍然有效吗?

    我刚遇到 http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm这有帮助吗?与 PyGTK 2.0 一样多的资源。已弃用。

    最佳答案

    问题解决了!对于遇到同样问题的其他人,我将收集一些有用的资源和我的示例代码。如果你知道怎么做也没关系,但它真的没有记录在案。

  • 正确派生自 GObject具有属性:
    http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html
  • 如何欺骗 TreeView 接受 CellRendererText 的自定义值,包括用于实现传递给 set_cell_data_func 的函数的有用片段(需要适应 TreeView )
    How to make GtkListStore store object attribute in a row?
  • 关于 TreeViews 的一般良好文档
    http://python-gtk-3-tutorial.readthedocs.org/en/latest/treeview.html

  • 完整的示例代码,用于让 TreeView 填充人员并在单击按钮时打印所选人员:

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

    class Person (GObject.GObject):
    name = GObject.property(type=str)
    age = GObject.property(type=int)
    gender = GObject.property(type=bool, default=True)

    def __init__(self):
    GObject.GObject.__init__(self)

    def __repr__(self):
    s = None
    if self.get_property("gender"): s = "m"
    else: s = "f"
    return "%s, %s, %i" % (self.get_property("name"), s, self.get_property("age"))

    class MyApplication (Gtk.Window):

    def __init__(self, *args, **kwargs):
    Gtk.Window.__init__(self, *args, **kwargs)
    self.set_title("Tree Display")
    self.set_size_request(400, 400)
    self.connect("destroy", Gtk.main_quit)
    self.create_widgets()
    self.insert_rows()
    self.show_all()

    def create_widgets(self):
    self.treestore = Gtk.TreeStore(Person.__gtype__)
    self.treeview = Gtk.TreeView()
    self.treeview.set_model(self.treestore)
    column = Gtk.TreeViewColumn("Person")

    cell = Gtk.CellRendererText()
    column.pack_start(cell, True)

    column.set_cell_data_func(cell, self.get_name)

    self.treeview.append_column(column)
    vbox = Gtk.VBox()
    self.add(vbox)
    vbox.pack_start(self.treeview, True, True, 0)

    button = Gtk.Button("Retrieve element")
    button.connect("clicked", self.retrieve_element)
    vbox.pack_start(button, False, False, 5)

    def get_name(self, column, cell, model, iter, data):
    cell.set_property('text', self.treestore.get_value(iter, 0).name)

    def insert_rows(self):
    for name, age, gender in [("Tom", 19, True), ("Anna", 35, False)]:
    p = Person()
    p.name = name
    p.age = age
    p.gender = gender
    self.treestore.append(None, (p,))

    def retrieve_element(self, widget):
    model, treeiter = self.treeview.get_selection().get_selected()
    if treeiter:
    print "You selected", model[treeiter][0]

    if __name__ == "__main__":
    GObject.type_register(Person)
    MyApplication()
    Gtk.main()

    关于GTK+ 3.0 : How to use a Gtk. 带有自定义模型项目的 TreeStore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178743/

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