神秘的GObject警告:断言`G_IS_OBJECT (object)`失败

9 投票
3 回答
20514 浏览
提问于 2025-04-16 23:25

我在运行我的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 个回答

-1

在很多情况下,这意味着另一个线程试图访问用户界面线程的组件。

0

问题出在Gtk.py的TreeModel._convert_value这个地方。它在检查能不能把一个值放进GObject.Value()之前,先用类型初始化了这个值,这样就可能不合适了。

我找到了解决办法,就是把传给gtk.TreeStore()的类型从Gdk.Pixbuf改成gobject.TYPE_PYOBJECT

5

我来猜测一下这个问题...

PyGTK似乎很擅长制造一些奇怪的错误,尤其是那些让我们追来追去的错误。我遇到过六七种这样的错误,最后发现它们其实只是掩盖了另一个问题,有时候甚至是完全不相关的问题。

不过,网上搜索一下会发现,这种情况已经被记录下来,虽然可能没有找到解决办法...?(比如这个例子:https://bugs.launchpad.net/ubuntu/+source/jockey/+bug/814991

如果这个程序没有抛出任何错误,也许你可以写一个捕获语句来让最终程序安静下来,不显示错误?

撰写回答