当我运行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中正确渲染,所以我不确定发生了什么。
问题出在Gtk.py的
TreeModel._convert_value
中。它检查是否可以将值放入GObject.Value()
中,但在检查是否合适之前,它会使用类型初始化该值。我可以通过将传递到
gtk.TreeStore()
的类型从Gdk.Pixbuf
更改为gobject.TYPE_PYOBJECT
来解决这个问题。对这件事胡乱猜测。。。
PyGTK似乎很擅长制造奇怪的错误——尤其是那些让我们大惊小怪的错误。我已经克服了六七个不同的错误,最终,这些错误只是掩盖了另一个问题…有时甚至是一个无关的问题。
尽管如此,运行一个Google搜索显示这已经被记录在案了,尽管也许还没有解决。。。?(例如:https://bugs.launchpad.net/ubuntu/+source/jockey/+bug/814991)
如果这没有抛出任何错误,也许您应该在中编写一个catch语句以在最终程序中消除错误?
相关问题 更多 >
编程相关推荐