神秘的 GObject 警告:断言 `G_IS_OBJECT (object)' 失败
Posted
技术标签:
【中文标题】神秘的 GObject 警告:断言 `G_IS_OBJECT (object)\' 失败【英文标题】:Mysterious GObject warning: assertion `G_IS_OBJECT (object)' failed神秘的 GObject 警告:断言 `G_IS_OBJECT (object)' 失败 【发布时间】:2011-10-25 07:46:36 【问题描述】:我在运行我的 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。不用说,我确定我的所有行传递的格式正确,因为就像我说的那样,警告总是在第一行之后提出,无论我先添加哪一行。
有人知道是什么原因造成的吗?它不会阻止我的应用程序运行,所以它不是紧急情况,但我宁愿不让它向最终用户发出警告。
编辑:
我使用 Python 的 -W all
命令行参数确认实际上所有行都会发出警告。
我尝试使用pdb
进入append()
方法,但有趣的是,当它尝试设置包含GdkPixbuf 的列的值时,它会卡在gi
代码中的循环中,所以我从未真正看到调试程序时引发的警告。我的猜测是 Pixbuf 导致了问题,但我不知道如何更改它以消除警告。 Pixbuf 在 TreeView 中正确呈现,所以我不确定发生了什么。
【问题讨论】:
我认为默认情况下 Python 会静音相同类型的重复警告 - 所以仅仅因为你只看到一次并不意味着它只引发一次。 嗯好吧,这有点让人放心。我的猜测是它要么不喜欢 Pixbuf 或其中的对象,但我不知道我还能如何指定它。 您是否尝试查看回溯? 好的,首先,通过使用 Python 的-W all
命令行参数启动应用程序,我确认添加的每一行都确实发生了警告。
@ptomato:我想我是堆栈跟踪的新手。traceback
模块似乎没有帮助,因为它是一个警告而不是异常;我似乎无法捕获发生警告的堆栈。我可以使用warnings
模块强制将警告作为异常引发,但此代码发生在线程中,warnings
不是线程安全的。任何提示将不胜感激。
【参考方案1】:
对此进行疯狂的猜测......
PyGTK 似乎在创造奇怪的错误方面很有天赋——尤其是那些让我们大吃一惊的错误。我已经解决了六七个不同的此类错误,这些错误最终只是掩盖了另一个问题……有时甚至是一个不相关的问题。
同样,运行 Google 搜索表明这已记录在案,但可能没有解决......? (一个这样的例子:https://bugs.launchpad.net/ubuntu/+source/jockey/+bug/814991)
如果这没有抛出任何错误,也许你应该写一个 catch 语句来消除最终程序中的错误?
【讨论】:
这实际上是使用 PyGObject 的。我将它移植到 PyGTK 并且警告甚至没有出现在那里。所以这很奇怪...... 都一样,如果报错,对程序没有实际影响,不妨静音。如果您没有收到错误,那么我想我们永远不会知道它来自哪里......:3 关于你的最后一个问题,不幸的是,将警告作为异常捕获是不可能的,因为这是在线程中并且使用warnings
context_manager 不是线程安全的。这是一个桌面应用程序,因此如果用户从图标启动它就不会看到它,但是在开发它时让我很烦。
只是为了澄清:目前我正在维护它的两个分支,一个 GTK3/pygobject,一个 GTK2/pygtk(因为没有明智的方法同时支持两者)。这个问题在 pygobject fork 中继续存在,但是,就像我说的,因为它不是一个停止器,所以它对我来说比什么都烦。最终用户(可能)不会看到或注意到它。【参考方案2】:
问题出在 Gtk.py 的TreeModel._convert_value
中。它会检查是否可以将值放入GObject.Value()
,但它会在检查是否合适之前使用类型初始化值。
我能够通过将传递给gtk.TreeStore()
的类型从Gdk.Pixbuf
更改为gobject.TYPE_PYOBJECT
来解决此问题。
【讨论】:
以上是关于神秘的 GObject 警告:断言 `G_IS_OBJECT (object)' 失败的主要内容,如果未能解决你的问题,请参考以下文章