图片将解释标题:
在LMDE& Ubuntu 12.04我的GtkIconView看起来像这样 - 它在图标之间的间距方面是正确的:
在Ubuntu 12.10,13.04& Fedora 17的相同代码显示如下:
N.B。 - 这是一个rhythmbox python插件 - 源代码是here on GitHub
我检查了以下GtkIconView属性 - 它们在Ubuntu 12.04和错误显示的12.10版本之间完全相同。
当我将 text_column 或 markup_column (图标下的文字)设置为可见列时,即将值设置为-1时,会立即显示此显示行为到列号。
如果文本列/标记列被隐藏(即值为-1),则所有发行版的显示都是正确的。
由于它在完全相同的音乐集上运行相同的代码 - 我只能猜测Fedora 17 / Ubuntu 12.10 / 13.04中较新的GTK库表现不同。
我的google-fu只发现this reference听起来完全一样。然而,检查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
仅供参考 - 我在Ubuntu 12.04和12.10上使用了现成的PPA from AnthonyWong。
两个版本的结果完全相同。尝试使用应用程序更改IconView属性并没有真正解决这个问题。
deinonychusaur的下一个建议看起来非常有趣,我可以证实 - 即
IconView CellRendererText是Fedora 17 / 12.10 / 13.04中IconView Pixbuf的2倍,但是12.04中IconView Pixbuf的1倍。
答案 0 :(得分:6)
上游GTK开发人员决定change the algorithm如何计算IconView的TextRenderer单元格的宽度。
这里我们采用相同的旧猜测,尝试图标大小并设置为double 在列表中找到的第一个图标的大小,天真,但工作量很大 时间
此更改是在Ubuntu 12.04和更早版本的旧GTK版本之后提交的。 LMDE。它进入了Ubuntu 12.10和更高版本中的后续GTK版本。 13.04& Fedora 17。
自从Ubuntu 12.04发布以来,这个问题已经发生了一年多,看来这不是一个错误,而是一个设计决定。
也许有点奇怪 - 在Bugzilla this was reported上另一个应用程序(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)
答案 1 :(得分:2)
使用@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
答案 2 :(得分:0)
为了正确地重现这一点:
话虽如此,我遇到了一些问题,不同版本的gtk +行为不同,以至于我无法在linux(最新的gtk)上可靠地开发并部署到windows(固定版本)。
随着时间的推移,错误在gtk +中修复,引入了新功能,你不能真正期望不同版本之间的像素完美再现。