【发布时间】: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不是线程安全的。任何提示将不胜感激。
标签: python gtk pygtk gobject pygobject