Python 是什么导致不同GTK版本之间GtkIconView的显示行为不同?
图片将解释标题: 在LMDE和Ubuntu12.04下,我的GtkIconView看起来是这样的-就图标之间的间距而言是正确的: 在Ubuntu 12.10、13.04和Fedora 17下,相同的代码显示如下: 注意-这是一个RhythBox python插件-源代码是 我已经检查了以下GtkIconView属性——它们在Ubuntu 12.04和错误显示的12.10版本中完全相同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更改为列
- 项目填充
- 行距
- 柱间距
- 项目宽度
好的-我已经试着将其简化为基本要素-这个简单的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+中的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版本,因为可能至少有一些变更日志在某处将引导您在