当我运行我的GTK(Python GObject内省)应用程序时,我有一个警告,我无法弄清楚它的来源。当应用程序加载并且我正在填充GtkListStore时,在我第一次添加行之后,我收到以下警告:
/usr/lib/python2.7/site-packages/gi/types.py:44: Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed
return info.invoke(*args)
其余的行追加而没有任何进一步的警告。实际上,它总是只被提升一次,总是在第一个要追加的项目上。但是,该行的实际内容似乎并不重要;它无论如何都会提出警告。当程序完成加载时,当我在TreeView中浏览它们时,所有行似乎都没问题。
我的列表商店如下所示:
self.list_store = Gtk.ListStore(bool, str, str, str, str, str, str,
str, str, str, str, GdkPixbuf.Pixbuf,
str, str, str, object, Pango.Weight)
最后几列是从相关的GtkTreeView中隐藏的,但警告发生在TreeView创建之前,所以我确定它来自ListStore.Needless说,我确定所有的行我都是传递的格式是正确的,因为就像我说的那样,警告总是在第一行之后引发,无论我先添加哪一行。
有谁知道可能导致这种情况的原因是什么?它并没有阻止我的应用程序运行,所以这不是紧急情况,但我宁愿不让它为最终用户吐出警告。
编辑:
我确认使用Python的-W all
命令行参数,实际上是为所有行引发了警告。
我尝试使用append()
单步进入pdb
方法但是,当它尝试设置包含GdkPixbuf的列的值时,它会卡在gi
代码的循环中,所以我从未真正看到调试程序时出现的警告。我的猜测是Pixbuf导致问题,但我不知道如何更改它以摆脱警告。 Pixbuf在TreeView中正确呈现,所以我不确定发生了什么。
答案 0 :(得分:4)
对此进行疯狂猜测......
PyGTK似乎在创造奇怪的错误方面非常有才华 - 特别是那些让我们陷入疯狂追逐的错误。我已经打了六七个不同的错误,最终只是掩盖了另一个问题......有时甚至是一个无关的问题。
同样,运行谷歌搜索显示这已被记录,但可能没有解决......? (一个这样的例子:https://bugs.launchpad.net/ubuntu/+source/jockey/+bug/814991)
如果没有抛出任何错误,也许你应该编写一个catch语句来解决最终程序中的错误?
答案 1 :(得分:0)
问题在于Gtk.py的TreeModel._convert_value
。它检查是否可以将值放在GObject.Value()
中,但在检查它是否合适之前,它会使用类型初始化Value。
我能够通过将gtk.TreeStore()
传递给Gdk.Pixbuf
的类型更改为gobject.TYPE_PYOBJECT
来解决此问题。