Что вызывает различное поведение отображения для GtkIconView между различными версиями GTK?
изображения объяснят название:
в LMDE & Ubuntu 12.04 мой GtkIconView выглядит так - его правильный с точки зрения расстояния между значками:
в Ubuntu 12.10, 13.04 & Fedora 17 тот же код отображается следующим образом:
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+ с течением времени, появились новые функции, вы не можете ожидать идеального воспроизведения пикселей между различными версиями.