9

图片将解释标题:

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

间距 Ubuntu 12 04 RB 96

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

间距 Ubuntu 12 10 RB 97

注意 - 这是一个节奏盒 python 插件 - 源代码在 GitHub 上

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

  • 项目填充
  • 行间距
  • 列间距
  • 项目宽度

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

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

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

我的 google-fu 只找到了这个听起来相同的参考。但是检查 ubuntu-accomplishment-viewer 源代码并没有真正启发我。

有没有其他人遇到过这个?关于进一步调查的最佳方法有什么建议吗?


好的 - 我试图将其简化为基本要素 - 这个简单的 glade 文件和这个简单的代码会产生这个问题。但是我仍然不知道是什么导致了这种视觉效果:/

#!/usr/bin/env python

从 gi.repository 导入 Gtk, GdkPixbuf

窗口 = 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(页面)

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

对于范围内的 i (15):
    ls.append(['项目 %d' % i, 图标])

cover_view = ui.get_object('covers_view')
cover_view.set_model(ls)
封面视图.set_text_column(0)
覆盖视图.set_pixbuf_column(1)
cover_view.set_item_width(100)

# 这些行更容易看出问题
crt, crp = cover_view.get_cells()
crt.set_property('背景', '#000')
crt.set_property('前景', '#AAA')
打印 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 中都使用了来自 AnthonyWong的现成PPA。

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

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

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

4

3 回答 3

6

观察的原因。

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

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

此更改是在 Ubuntu 12.04 和 LMDE 中较旧的 GTK 版本之后提交的。它进入了 Ubuntu 12.10 & 13.04 & Fedora 17 中的较晚 GTK 版本。

错误或没有错误

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

可能有点奇怪 - 在 Bugzilla 上,这是针对另一个应用程序(Pitivi 视频编辑器)报告的,但在撰写本文时仍处于未确认状态。

解决方法

该链接中有用的是一个附件,它提供了一种解决方法,您可以在其中创建 CellRendererText 并将其分配给 IconView,然后再定义标记/文本列。

以下是我对解决方法的解释

封面大小=100
markup_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)
于 2013-01-04T20:39:30.163 回答
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)

如果您将 a 添加print crt, args到回调中,您可以看到它会出现大约 10-20 次......同时处理属性widthwrap-width

于 2013-01-04T13:17:15.150 回答
0

为了正确重现这一点:

  • 不要使用系统 gtk rc
  • 不要使用用户 gtk rc
  • 仅应用您自己的 gtk rc
  • 在例如 virtualbox 中设置两个版本
  • 均衡系统参数,例如 dpi
  • 使用相同的数据运行
  • 发布使用的精确版本、py、pygtk、gtk+、依赖库

话虽如此,但我遇到了不同版本的 gtk+ 行为不同的问题,以至于我无法在 linux(最新的 gtk)上可靠地开发并部署到 Windows(固定版本)。

随着时间的推移,在 gtk+ 中修复了错误,引入了新功能,您不能真正期望在不同版本之间实现像素完美的再现。

于 2013-01-04T12:21:19.890 回答