【问题标题】:GenericTreeModel with PyGObject Introspection Gtk+ 3?带有 PyGObject 内省 Gtk+ 3 的 GenericTreeModel?
【发布时间】:2012-06-17 01:11:18
【问题描述】:

我正在尝试在 Python3 中基于 GenericTreeModel 编写自己的 Gtk+3-TreeModel,但出现此错误:

AttributeError: 'gi.repository.Gtk' 对象没有属性 'GenericTreeModel'

GenericTreeModel 改名了吗?

提前致谢。

【问题讨论】:

    标签: python python-3.x gtk3 pygobject treemodel


    【解决方案1】:

    PyGObject 最近通过 pygtkcompat 获得了 GenericTreeModel 支持。

    这是 3.7.90 中的新功能,在 3.7.91 中进行了修复

    所以现在您应该能够通过使用兼容性模块来迁移 GenericTreeModels,至少作为一个开始。

    【讨论】:

      【解决方案2】:

      所以我已经处理了一段时间了。这是我的结果:

      • 正如 Havok 已经说过的:GenericTreeModel 不再存在,必须使用普通的gtk.TreeModel 接口并覆盖适当的方法(将它们命名为do_…):

        class TreeModel(GObject.GObject, gtk.TreeModel):
           def do_get_iter(self, iter, path):
               …
               iter.user_data = whatever()
               return True
        
      • 在使用自定义迭代器等时,从 ListStore 或 TreeStore 继承不起作用。

      • 带有调用信息的存储库已损坏(请参阅launchpad:gtk3#1024492),因此在没有 iter 参数的情况下调用 do_get_iter 方法,因此您无法在其上设置自定义数据。 要修复它,将 /usr/share/gir-1.0/Gtk-3.0.gir 中的 iter 参数的方向从 "out" 更改为 "in" 并运行:

        g-ir-compiler --output=/usr/lib/girepository-1.0/Gtk-3.0.typelib /usr/share/gir-1.0/Gtk-3.0.gir
        

      【讨论】:

        【解决方案3】:

        我在 PyGObject 和 Gtk 中都找不到对 GenericTreeModel 的任何引用,但我认为您正在寻找的只是 TreeModel:

        http://developer.gnome.org/gtk3/stable/GtkTreeModel.html

        TreeModel是接口,由ListStore、TreeModelFilter、TreeModelSort和TreeStore实现。

        >>> from gi.repository import Gtk
        >>> dir(Gtk.TreeModel)
        ['__bool__', '__class__', '__delattr__', '__delitem__', '__dict__', '__doc__',
         '__format__', '__gdoc__', '__getattribute__', '__getitem__', '__gtype__', '__hash__', 
         '__info__', '__init__', '__iter__', '__len__', '__module__', '__new__', '__nonzero__',
         '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', 
         '__str__', '__subclasshook__', '__weakref__', '_convert_row', '_convert_value', 
         '_getiter', 'filter_new', 'foreach', 'get', 'get_column_type', 'get_flags', 'get_iter',
         'get_iter_first', 'get_iter_from_string', 'get_n_columns', 'get_path', 
         'get_string_from_iter', 'get_value', 'iter_children', 'iter_has_child', 
         'iter_n_children', 'iter_next', 'iter_nth_child', 'iter_parent', 'iter_previous', 
         'ref_node', 'row_changed', 'row_deleted', 'row_has_child_toggled', 'row_inserted', 
         'set_row', 'sort_new_with_model', 'unref_node']
        

        编辑:

        在旧的 PyGtk API 中找到 what you are looking for,遗憾的是,这是一个仅 PyGtk 的创作。使用自省的东西你只能得到 Gtk 直接提供的东西,所以你必须直接处理 TreeModel。

        希望对你有帮助。

        【讨论】:

        • @JanHolthuis:你能汇报一下你的进展吗?我正在尝试将基于 GenericTreeModel 的应用程序移植到 pygobject,但尚未成功。
        猜你喜欢
        • 2012-07-20
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多