Python 神秘的GObject警告:断言'G#u IS_OBJECT(OBJECT)';失败

Python 神秘的GObject警告:断言'G#u IS_OBJECT(OBJECT)';失败,python,gtk,pygtk,gobject,pygobject,Python,Gtk,Pygtk,Gobject,Pygobject,当我运行我的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) 其余

当我运行我的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)
其余的行在没有任何进一步警告的情况下追加。事实上,它总是只引发一次,总是在要附加的第一项上。但是,行的实际内容似乎并不重要;不管发生什么,它都会发出警告。当程序完成加载时,当我在树视图中浏览所有行时,它们似乎都正常

我的列表存储如下所示:

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。不用说,我确信我传递的所有行的格式都是正确的,因为正如我所说,警告总是在第一行之后发出,无论我先添加哪一行

有人知道这是什么原因吗?它不会阻止我的应用程序运行,所以这不是紧急情况,但我不希望它向最终用户发出警告


编辑: 我使用Python的
-wall
命令行参数确认警告实际上是针对所有行发出的


我尝试使用
pdb
进入
append()
方法,但有趣的是,当它尝试设置包含GdkPixbuf的列的值时,它被困在
gi
代码中的一个循环中,因此我从未真正看到调试程序时发出的警告。我猜是Pixbuf导致了这个问题,但我不知道如何改变它来消除警告。Pixbuf在树状视图中正确呈现,因此我不确定发生了什么。

对此进行大胆猜测

PyGTK似乎在制造奇怪的错误方面相当有天赋——特别是那些让我们大惊小怪的错误。我已经克服了六七个不同的错误,这些错误最终只是掩盖了另一个问题……有时甚至是一个无关的问题

尽管如此,运行谷歌搜索显示,这已经被记录在案,尽管可能没有解决。。。?(一个这样的例子:)


如果这没有抛出任何错误,也许您应该在中编写一个catch语句以在最终程序中消除错误?

问题出在Gtk.py的
TreeModel.\u convert\u value
。它检查是否可以将该值放入
GObject.value()
,但在检查该值是否合适之前,它会使用该类型初始化该值


我可以通过将传递到
gtk.TreeStore()
的类型从
Gdk.Pixbuf
更改为
gobject.type_PYOBJECT

来解决这个问题,我认为默认情况下Python会消除相同类型的重复警告-因此,只看到一次并不意味着它只出现一次,这有点让人放心。我猜它要么不喜欢Pixbuf,要么不喜欢其中的对象,但我不知道如何指定它。您是否尝试过查看回溯?好的,首先,通过使用Python的
-W all
命令行参数启动应用程序,我确认,添加的每一行确实都会出现警告。@ptomato:我想我对堆栈跟踪是新手。
traceback
模块似乎没有帮助,因为它是一个警告,而不是一个例外;我似乎无法捕获发生警告的堆栈。我可以使用
warnings
模块强制将警告作为异常引发,但此代码发生在线程中,
warnings
不是线程安全的。任何提示都将不胜感激。这实际上是PyGObject。我把它移植到PyGTK上了,但那里甚至没有提出警告。所以这很奇怪……尽管如此,如果你得到了错误,并且对程序没有实际影响,你还是把它静音吧。如果您没有收到错误,那么我想我们永远也不会知道它来自何方……:3关于您的最后一个问题,不幸的是,捕获警告作为异常是不可能的,因为这是在一个线程中,并且使用
warnings
context\u管理器不是线程安全的。这是一个桌面应用程序,因此如果用户从图标启动它,用户不会看到它,但在开发它时它会让我很恼火。只是为了澄清一下:目前我正在维护两个分叉,一个GTK3/pygobject,一个GTK2/pygtk(因为没有明智的方法同时支持这两个分叉)。这个问题在pygobject fork中仍然存在,但是,正如我所说的,因为它不是一个showstopper,所以它对我来说比任何事情都更麻烦。最终用户(可能)不会看到或注意到它。