是什么导致GtkIconView在不同GTK版本之间的不同显示行为?

fos*_*dom 9 python pygobject gtk3

图片将解释标题:

在LMDE和Ubuntu 12.04下,我的GtkIconView看起来像这样 - 它在图标之间的间距方面是正确的:

间距Ubuntu 12 04 RB 96

在Ubuntu 12.10,13.04和Fedora 17下,相同的代码显示如下:

间距Ubuntu 12 10 RB 97

NB - 这是一个rhythmbox python插件 - 源代码在GitHub上

我检查了以下GtkIconView属性 - 它们在Ubuntu 12.04和错误显示的12.10版本之间完全相同.

  • 项目 - 衬垫
  • 行间距
  • 列间距
  • 项宽度

当我将text_columnmarkup_column(图标下的文本)设置为可见列(即将值从-1更改为列号)时,会立即显示此显示行为.

如果文本列/标记列被隐藏(即值为-1),则显示在所有发行版上都是正确的.

由于它在完全相同的音乐集合上运行相同的代码 - 我只能推测Fedora 17/Ubuntu 12.10/13.04中较新的GTK库表现不同.

我的google-fu只发现了这个听起来相同的引用.然而,检查ubuntu-achievementment-viewer源代码并没有真正启发我.

有没有人遇到过这个?关于进一步调查的最佳方法的任何建议?


好的 - 我已经尝试将其简化为基本要素 - 这个简单的glade文件使用这个简单的代码会产生这个问题.然而,我仍然不知道造成这种视觉效果的原因:/

#!/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()

和林间空地 - http://pastebin.com/uvQ9mWeg


根据deinonychusaur的建议,我查看了gtkparasite

仅供参考 - 我使用了AnthonyWong的现成PPA用于Ubuntu 12.04和12.10.

两个版本的结果完全相同.尝试使用应用程序更改IconView属性并没有真正解决这个问题.

来自deinonychusaur的下一个建议看起来非常有趣,我可以确认 - 即

IconView CellRendererText是Fedora 17/12.10/13.04中IconView Pixbuf的2倍,但是12.04中IconView Pixbuf的1倍.

fos*_*dom 6

观察的原因.

上游GTK开发人员决定更改算法,以了解如何计算IconView的TextRenderer单元格的宽度.

在这里,我们使用相同的旧猜测,尝试图标大小并设置列表中找到的第一个图标的大小的两倍,天真,但大部分时间工作

此更改是在Ubuntu 12.04和LMDE中使用较旧的GTK版本之后提交的.它在Ubuntu 12.10和13.04以及Fedora 17中找到了后来的GTK版本.

错误或没有错误

自从Ubuntu 12.04发布以来,这个问题已经发生了一年多,这似乎不是一个错误,而是一个设计决定.

也许有点奇怪 - 在Bugzilla 上报道了另一个应用程序(Pitivi视频编辑器),但在撰写本文时,这仍处于未经证实的状态.

解决方法

在该链接中有用的是附件,提供了一种解决方法,您可以在其中创建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)