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

时间:2012-12-30 10:53:14

标签: python gtk3 pygobject

图片将解释标题:

在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。 - 这是一个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倍。

3 个答案:

答案 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次...处理属性widthwrap-width

答案 2 :(得分:0)

为了正确地重现这一点:

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

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

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