Как настроить текст, отображаемый в `Gtk.TreeViewColumn`?

#python #python-3.x #gtk3 #pygtk #pygobject

#python #python-3.x #gtk3 #pygtk #pygobject

Вопрос:

У меня есть размер файла в байтах, хранящийся в Gtk.ListStore , и я хочу, чтобы они отображались в удобочитаемом формате с помощью Gtk.CellRendererText . Читая документацию, кажется, что Gtk.TreeViewColumn.set_cell_data_func() это способ добиться этого. Его настройка работает без ошибок, но как только требуется отобразить ячейку, все приложение вылетает после нескольких неудачных утверждений.

Это код, который я использую:

 self._builder.get_object("ContentList.Size").set_cell_data_func(
    Gtk.CellRendererText(),
    self.render_formatted_size
)
  

И это то, что печатается в stderr:

 /usr/lib/python3.7/site-packages/gi/overrides/Gio.py:44: Warning: g_object_freeze_notify: assertion 'G_IS_OBJECT (object)' failed
  return Gio.Application.run(self, *args, **kwargs)
/usr/lib/python3.7/site-packages/gi/overrides/Gio.py:44: Warning: g_object_get: assertion 'G_IS_OBJECT (object)' failed
  return Gio.Application.run(self, *args, **kwargs)
/usr/lib/python3.7/site-packages/gi/overrides/Gio.py:44: Warning: g_object_set: assertion 'G_IS_OBJECT (object)' failed
  return Gio.Application.run(self, *args, **kwargs)
/usr/lib/python3.7/site-packages/gi/overrides/Gio.py:44: Warning: g_object_is_floating: assertion 'G_IS_OBJECT (object)' failed
  return Gio.Application.run(self, *args, **kwargs)
/usr/lib/python3.7/site-packages/gi/overrides/Gio.py:44: Warning: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed
  return Gio.Application.run(self, *args, **kwargs)
  

Содержимое self.render_formatted_size здесь не должно иметь значения. Похоже, что это никогда не выполняется.

PS: Добавление дополнительных столбцов string в модель не является вариантом, так как я хочу иметь возможность изменять единицы отображения (SI, IEC) в любое время.

Ответ №1:

Вы передаете недавно созданный CellRenderer, а не существующий. Вместо этого следует сделать что-то вроде этого:

 rend = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("title", rend)
column.set_cell_data_func (rend, cell_fn, None);
tree.append_column(column)
  

Комментарии:

1. Спасибо, чувак, это было полезно. Дело не в том, что я не создавал экземпляр. Как вы можете видеть, в моем коде есть () после Gtk.CellRendererText . Но, размышляя о приведенных вами аргументах Gtk.TreeViewColumn() , я заметил, что не прикрепил средство визуализации к столбцу, которое я получил от Gtk.Builder . Итак, теперь, после присоединения его с помощью вызова column.pack_start(rend) , это работает.