Что вызывает различное поведение отображения для GtkIconView между различными версиями GTK?

изображения объяснят название:

в LMDE & Ubuntu 12.04 мой GtkIconView выглядит так - его правильный с точки зрения расстояния между значками:

Spacing Ubuntu 12 04 RB 96

в Ubuntu 12.10, 13.04 & Fedora 17 тот же код отображается следующим образом:

Spacing Ubuntu 12 10 RB 97

N. B.-Это плагин python rhythmbox-исходный код здесь на GitHub

Я проверил следующие атрибуты GtkIconView - они точно так же между Ubuntu 12.04 и в 12.10 версия неправильно отображается.

  • пункт-обивка
  • междурядьях
  • интервал между столбцами
  • элемент-ширина

это поведение дисплея происходит немедленно, когда я устанавливаю либо text_column или markup_column (текст под значками), чтобы быть видимым столбцом, т. е. изменение значения от -1 до столбца число.

Если столбец текста/столбец разметки скрыт (т. е. значение -1) , то отображение корректно на всех дистрибутивах.

поскольку его тот же код работает на точно такой же музыкальной коллекции - я могу только предположить, что новые библиотеки GTK в Fedora 17/Ubuntu 12.10/13.04 ведут себя по-разному.

мой google-fu нашел только этой ссылке что звучит идентично. Однако изучение исходного кода ubuntu-выполнение-viewer на самом деле не просветил меня.

кто-нибудь еще сталкивался с этим? Есть предложения, как лучше провести дальнейшее расследование?


Ok-Я попытался свести это к Bare essentials - этот простой файл поляны с этим простым кодом создает эту проблему. Однако я все еще не в курсе, что вызывает этот визуальный эффект :/

#!/usr/bin/env python

from gi.repository import Gtk, GdkPixbuf

window = Gtk.Window()
window.connect('delete_event', Gtk.main_quit)

ui = Gtk.Builder()
ui.add_from_file('reproduce.ui')

page = ui.get_object('main_box')
window.add(page)

ls = Gtk.ListStore(str, GdkPixbuf.Pixbuf)
icon = GdkPixbuf.Pixbuf.new_from_file_at_size(
    str("/usr/share/icons/gnome/48x48/actions/zoom-out.png"), 90, 90)

for i in range(15):
    ls.append(['Item %d' % i, icon])

covers_view = ui.get_object('covers_view')
covers_view.set_model(ls)
covers_view.set_text_column(0)
covers_view.set_pixbuf_column(1)
covers_view.set_item_width(100)

# These lines make it easier to see the problem
crt, crp = covers_view.get_cells()
crt.set_property('background', '#000')
crt.set_property('foreground', '#AAA')
print crt.get_request_mode()

window.set_default_size(600,400)
window.show_all()
Gtk.main()

3 ответов


поводом для наблюдения.

вверх по течению GTK разработчики решили изменить алгоритм о том, как рассчитать ширину ячейки TextRenderer IconView.

здесь мы идем с той же старой догадкой, попробуйте размер значка и установите двойной размер первого значка, найденного в списке, наивен, но работает много времени

это изменение было совершено после старой версии GTK в Ubuntu 12.04 & LMDE. Он нашел его путь в более поздние версии GTK, найденные в Ubuntu 12.10 & 13.04 & Fedora 17.

ошибка или не ошибка

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

возможно, немного странно - на Bugzilla об этом сообщил для другого приложения (PiTiVi video editor), но на момент написания этого по-прежнему неподтвержденные государство.

решение

то, что было полезно в этой ссылке, было вложением, дающим обходной путь, где вы создаете CellRendererText и назначаете это IconView до определения столбца разметки/текста.

ниже моя интерпретация обходного пути

cover_size=100
markup_text="some text"

self._text_renderer = Gtk.CellRendererText()
self._text_renderer.props.alignment = Pango.Alignment.CENTER
self._text_renderer.props.wrap_mode = Pango.WrapMode.WORD
self._text_renderer.props.xalign = 0.5
self._text_renderer.props.yalign = 0
self._text_renderer.props.width = cover_size
self._text_renderer.props.wrap_width = cover_size
self._cover_view.pack_end(self._text_renderer, False)
self._cover_view.add_attribute(self._text_renderer, 'markup', markup_text)

используя то, что @qama сказал о "on-resize-set-size-request hack", поведение может быть исправлено (хотя и действительно хакерским способом).

просто добавьте обратный вызов:

def keep_size(crt, *args):

    crt.handler_block(crt_notify)
    crt.set_property('width', 100)
    crt.handler_unblock(crt_notify)

и подключите его к CellRendererText:

crt, crp = covers_view.get_cells()
crt_notify = crt.connect('notify', keep_size)

если добавить print crt, args к обратному вызову вы можете видеть, что он идет туда около 10-20 раз... дело как со свойствами width и wrap-width


чтобы правильно воспроизвести это:

  • не используйте систему gtk rc
  • не используйте пользователя gtk rc
  • применить свой собственный gtk rc только
  • настройте обе версии, например virtualbox
  • выравнивание параметров системы, например dpi
  • запуск с теми же данными
  • post точная версия используется, py, pygtk, gtk+, зависимые libs

сказав это, я столкнулся с проблемами, когда разные версии gtk+ вел себя достаточно по-другому, что я не мог надежно развиваться на linux (до даты gtk) и развертываться в windows (фиксированная версия).

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