神秘的GObject警告:断言`G_IS_OBJECT (object)`失败
我在运行我的GTK(Python GObject introspection)应用程序时遇到了一个警告,但我搞不清楚是什么原因。应用程序加载时,我在填充一个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中渲染得很好,所以我不太明白发生了什么。
3 个回答
在很多情况下,这意味着另一个线程试图访问用户界面线程的组件。
问题出在Gtk.py的TreeModel._convert_value
这个地方。它在检查能不能把一个值放进GObject.Value()
之前,先用类型初始化了这个值,这样就可能不合适了。
我找到了解决办法,就是把传给gtk.TreeStore()
的类型从Gdk.Pixbuf
改成gobject.TYPE_PYOBJECT
。
我来猜测一下这个问题...
PyGTK似乎很擅长制造一些奇怪的错误,尤其是那些让我们追来追去的错误。我遇到过六七种这样的错误,最后发现它们其实只是掩盖了另一个问题,有时候甚至是完全不相关的问题。
不过,网上搜索一下会发现,这种情况已经被记录下来,虽然可能没有找到解决办法...?(比如这个例子:https://bugs.launchpad.net/ubuntu/+source/jockey/+bug/814991)
如果这个程序没有抛出任何错误,也许你可以写一个捕获语句来让最终程序安静下来,不显示错误?