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

Python 是什么导致不同GTK版本之间GtkIconView的显示行为不同?,python,gtk3,pygobject,Python,Gtk3,Pygobject,图片将解释标题: 在LMDE和Ubuntu12.04下,我的GtkIconView看起来是这样的-就图标之间的间距而言是正确的: 在Ubuntu 12.10、13.04和Fedora 17下,相同的代码显示如下: 注意-这是一个RhythBox python插件-源代码是 我已经检查了以下GtkIconView属性——它们在Ubuntu 12.04和错误显示的12.10版本中完全相同 项目填充 行距 柱间距 项目宽度 当我将文本列或标记列(图标下的文本)设置为可见列(即将值从-1更改为列

图片将解释标题:

在LMDE和Ubuntu12.04下,我的GtkIconView看起来是这样的-就图标之间的间距而言是正确的:

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

注意-这是一个RhythBox python插件-源代码是

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

  • 项目填充
  • 行距
  • 柱间距
  • 项目宽度
当我将文本列标记列(图标下的文本)设置为可见列(即将值从-1更改为列号)时,此显示行为立即发生

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

由于相同的代码运行在完全相同的音乐集上,我只能推测Fedora17/Ubuntu 12.10/13.04中较新的GTK库的表现有所不同

我的google fu只找到了听起来相同的。然而,检查ubuntu成就查看器的源代码并没有真正启发我

还有其他人遇到过这种情况吗?对进一步调查的最佳方式有何建议


好的-我已经试着将其简化为基本要素-这个简单的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() #!/usr/bin/env python 从gi.repository导入Gtk、GdkPixbuf window=Gtk.window() window.connect('delete_event',Gtk.main_quit) ui=Gtk.Builder() ui.add\u from\u文件('reproduct.ui')) page=ui.get\u对象(“主\u框”) 添加(第页) ls=Gtk.ListStore(str,GdkPixbuf.Pixbuf) icon=GdkPixbuf.Pixbuf.new_,来自大小为的_文件( str(“/usr/share/icons/gnome/48x48/actions/zoom-out.png”),9090) 对于范围(15)内的i: 追加(['项目%d'%i,图标]) covers\u view=ui.get\u对象(“covers\u view”) 覆盖视图。设置模型(ls) 覆盖视图。设置文本列(0) 覆盖视图。设置pixbuf列(1) 覆盖视图。设置项目宽度(100) #这些线条更容易看出问题所在 crt,crp=covers\u view.get\u cells() crt.set_属性('background','#000')) crt.set_属性('前景','#AAA') 打印crt.get_请求_模式() 窗口。设置默认大小(600400) window.show_all() Gtk.main() 还有林间空地-


根据我的建议

仅供参考-我使用了Ubuntu 12.04和12.10的现成版本

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

deinonychusaur的下一个建议看起来非常有趣,我可以证实——即


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

为了正确复制此信息:

  • 不要使用系统gtk rc
  • 不要使用用户gtk rc
  • 仅应用您自己的gtk rc
  • 在virtualbox中设置这两个版本
  • 均衡系统参数,例如dpi
  • 使用相同的数据运行
  • 使用了精确版本的post、py、pygtk、gtk+、依赖库
话虽如此,我还是遇到了一些问题,不同版本的gtk+的表现差异很大,以至于我无法在linux(最新的gtk)上可靠地开发并部署到windows(固定版本)


随着时间的推移,gtk+中的bug已被修复,新功能的引入,您无法真正期望在不同版本之间实现像素级完美复制。

使用@qama所说的“调整设置大小请求黑客”,行为可以被修复(尽管是以一种非常黑客的方式)

只需添加一个回调:

def keep_size(crt, *args):

    crt.handler_block(crt_notify)
    crt.set_property('width', 100)
    crt.handler_unblock(crt_notify)
并将其连接到
CellRenderText

crt, crp = covers_view.get_cells()
crt_notify = crt.connect('notify', keep_size)
如果您向回调中添加一个
打印crt,args
,您可以看到它会出现大约10-20次。。。处理属性
width
wrap width

观察的原因。 上游GTK开发人员决定讨论如何计算IconView的TextRenderer单元的宽度

在这里,我们使用相同的猜测,尝试图标大小并设置为双 在列表中找到的第一个图标的大小,虽然很简单,但效果很好 当时

此更改是在Ubuntu 12.04和LMDE中较旧的GTK版本之后提交的。它在Ubuntu12.10&13.04&Fedora17的GTK版本中找到了自己的路

虫子还是没有虫子 自从Ubuntu 12.04发布以来,这个问题已经发生了一年多了,看来这不是一个bug,而是一个设计决策

对于另一个应用程序(Pitivi视频编辑器),Bugzilla可能有点奇怪,但在撰写本文时,它仍然处于未确认状态

变通办法 在该链接中有用的是一个附件,它提供了一种解决方法,您可以在定义标记/文本列之前创建CellRenderText并将其分配给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) 封面尺寸=100 markup\u text=“一些文本” self._text_renderer=Gtk.cellrenderText() self.\u text\u renderer.props.alignment=Pango.alignment.CENTER self.\u text\u renderer.props.wrap\u mode=Pango.WrapMode.WORD self.\u text\u renderer.props.xalign=0.5 self.\u text\u renderer.props.yalign=0 self.\u text\u renderer.props.width=封面大小 self.\u text\u renderer.props.wrap\u width=封面大小 self.\u cover\u view.pack\u end(self.\u text\u渲染器,False) self.\u cover\u view.添加属性(self.\u text\u呈现程序,'标记',标记\u text) 两个想法:您(a)是否测试过使用gtk检查程序,以查看哪些特性可能导致问题?如果这是不可能的(b)检查不同平台上的gtk版本,因为可能至少有一些变更日志在某处将引导您在