GTK + 3.0:如何使用自定义模型项Gtk.TreeStore?(GTK+ 3.0: How t

2019-07-30 02:41发布

我想开发在Python GTK应用程序,我真的套牢的正确用法gtk.TreeStore 。 我的主要问题:我已经解析了一些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,字符串和GdkPixbuf的分别。

此外,它说,你可以插入任何GType 。 从文档的链接直接指向在这一段:

的数值代表一个注册类型的唯一标识符。

我的话题的研究在这里结束与谷歌发现有关将其他数据类型的不同之处主要是GTK 2.x的教程,并没有什么strint等。
问题:

  • 是否有可能实现一个新的GType(或任何其它接口,将在treestore可能使插入自定义数据),以及如何做到这一点?
    我已经尝试过,从获得GObject ,但它并没有帮助。

  • 我怎样才能摆脱保持两个数据结构在同一时间的?
    也就是说我的解析结果,并在Treestore重复信息。

  • 这怎么可能对付混合内容?
    在我来说,我有收藏和不同的附加信息(这是在TreeView镜像为有或无子节点)的项目。

如果以上问题都解决了,我也处理选择时摆脱的问题:它是难以企及的简单类型像strint ,以配合我之前插入一个项目。 这样的属性必须是一个关键,仍然你会搜索与被放弃无效的解析结果的列表。

先感谢您!

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


我想这可能是一个可行的挑战,实现自定义TreeModel ,直到我在读这对于GTK 2教程 :

然而,这一切是有代价的:你不可能写一个有用的自定义模型在不到一千行 ,除非你去除所有换行符。 编写自定义模型并不困难,因为它听起来虽然,这可能是值得的,这不仅是因为它会导致更加健壮的代码,如果你有大量的数据的跟踪。

这是否仍然有效?


我只是碰上了http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm这可能是有帮助吗? 由于许多resoucres它是PyGTK的2.0。 弃用。

Answer 1:

问题解决了! 对于其他人在同样的问题来了,我会堆积一些有用的资源,我的示例代码。 这没关系,如果你知道如何做到这一点,但它真的无处记录。

  • 从正确推导GObject与特性:
    http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html

  • 如何在接受定制值的伎俩一个TreeView CellRendererText ,包括传递给函数的实现有用的片段set_cell_data_func (需要适应的TreeView
    如何使连续GtkListStore存储对象的属性?

  • 上的TreeView一般好的文档
    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 with custom model items?