Загадочное предупреждение GObject: утверждение `G_IS_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, что предупреждение фактически возникает для всех строк.

Я попытался войти в метод append() с помощью pdb, но, что интересно, он зацикливается в коде gi, когда пытается установить значение столбца, содержащего GdkPixbuf, поэтому я никогда не видел предупреждения, возникающего при отладке программы. Я предполагаю, что Pixbuf вызывает проблему, но я понятия не имею, как изменить его, чтобы избавиться от предупреждения. Pixbuf правильно отображается в TreeView, поэтому я не уверен, что происходит.


person Community    schedule 11.08.2011    source источник
comment
Я думаю, что по умолчанию Python заглушает повторяющиеся предупреждения одного и того же типа, поэтому то, что вы видите его только один раз, не означает, что оно возникает только один раз.   -  person Thomas K    schedule 12.08.2011
comment
Хм, хорошо, это немного обнадеживает. Тогда я предполагаю, что ему либо не нравится Pixbuf, либо объект там, но я понятия не имею, как еще я мог бы указать это.   -  person    schedule 12.08.2011
comment
Вы пробовали смотреть на обратную трассу?   -  person ptomato    schedule 12.08.2011
comment
Хорошо, прежде всего, запустив приложение с аргументом командной строки Python -W all, я подтвердил, что предупреждение действительно происходит для каждой добавляемой строки.   -  person    schedule 12.08.2011
comment
@ptomato: Думаю, я новичок в трассировке стека. Модуль traceback, похоже, не помогает, поскольку это предупреждение, а не исключение; Кажется, я не могу зафиксировать стек, в котором возникает предупреждение. Я мог бы использовать модуль warnings, чтобы принудительно вызывать предупреждения как исключения, но этот код выполняется в потоке, а warnings не является потокобезопасным. Любые советы будут оценены.   -  person    schedule 12.08.2011
comment
@ Брэндон, я не знал, что warnings не является потокобезопасным. Но разве исключение все равно не возникнет?   -  person ptomato    schedule 13.08.2011
comment
Поскольку warnings изменяет глобальный контекст, я бы не стал рисковать.   -  person    schedule 13.08.2011


Ответы (2)


Делая дикие предположения по этому поводу...

PyGTK, кажется, довольно талантлив в создании странных ошибок, особенно тех, которые заставляют нас гоняться за дикими гусями. Я боролся с шестью или семью различными такими ошибками, которые, в конце концов, просто маскируют другую проблему ... иногда даже не связанную с ней.

Тем не менее, поиск в Google показывает, что это было задокументировано, хотя, возможно, и не решено...? (Один из таких примеров: https://bugs.launchpad.net/ubuntu/+source/jockey/+bug/814991)

Если это не вызывает никаких ошибок, возможно, вам следует написать оператор catch, чтобы заглушить ошибку в окончательной программе?

person CodeMouse92    schedule 13.08.2011
comment
Это на самом деле с PyGObject. Я портировал его на PyGTK, и там даже не появилось предупреждение. Так что странно... - person ; 14.08.2011
comment
Тем не менее, если вы получаете сообщение об ошибке, и это никак не влияет на программу, вы можете также отключить звук. Если вы не получаете ошибку, то, я думаю, мы никогда не узнаем, откуда она взялась...: 3 - person CodeMouse92; 14.08.2011
comment
Что касается вашего последнего вопроса, к сожалению, перехват предупреждений как исключений невозможен, поскольку это находится в потоке, а использование warnings context_manager не является потокобезопасным. Это настольное приложение, поэтому пользователь не увидит его, если запустит его с помощью значка, но меня это раздражает при разработке. - person ; 14.08.2011
comment
Просто для уточнения: на данный момент я поддерживаю два его форка, один GTK3/pygobject, один GTK2/pygtk (поскольку нет разумного способа поддерживать оба одновременно). Эта проблема сохраняется в форке pygobject, но, как я уже сказал, поскольку это не шоу-стоппер, это больше раздражает меня, чем что-либо еще. Конечный пользователь (вероятно) этого не увидит и не заметит. - person ; 14.08.2011

Проблема в Gtk.py TreeModel._convert_value. Он проверяет, можно ли поместить значение в GObject.Value(), но инициализирует значение типом, прежде чем проверять, подходит ли оно.

Мне удалось обойти проблему, изменив тип, переданный в gtk.TreeStore(), с Gdk.Pixbuf на gobject.TYPE_PYOBJECT.

person Thomas Leonard    schedule 09.07.2012