可以把GtkTreeView像GtkIconView那样绘制吗?
我正在用Python开发一个GTK+应用程序,使用的是PyGtk。我的应用主要是用来管理视频的,就像F-spot或Picasa,但它是专门为视频设计的。
在这两个应用中,你会看到一个中央区域,可以看到所有的照片,下面还有标签缩略图。
在我的应用里,我想实现类似的视图。目前我只是简单地使用了这个:
一个gtk.Table
,里面有一个VBox
,在VBox
里有一个Pixbuf
(我的视频缩略图),还有一个HBox
,在HBox
里放了尽可能多的Pixbuf
作为标签。
这样是可以工作的,但看起来很丑,而且似乎不是最好的解决方案。
我仔细查看了文档,发现有两个小部件比较符合我的需求:IconView
和TreeView
。但是IconView
每一行只能显示一个缩略图,而TreeView
则不能像IconView
那样以网格形式显示。
我的问题是:有没有办法让TreeView
像IconView
一样以网格形式显示?你会如何实现F-spot那种排列照片和标签的方式呢?
2 个回答
IconView
是你需要的东西。在 ListStore
中,每一行只代表一个图像,但 IconView
可以把这些图像以网格的形式排列。这里有一个简单的例子,你可以用你想展示的图像文件作为参数来启动它,比如:
python example.py /usr/share/icons/hicolor/16x16/apps/*
.
import sys
import gtk
store = gtk.ListStore(gtk.gdk.Pixbuf)
iv = gtk.IconView(store)
iv.set_pixbuf_column(0)
for arg in sys.argv[1:]:
pixbuf = gtk.gdk.pixbuf_new_from_file(arg)
store.append((pixbuf, ))
w = gtk.Window()
w.connect('destroy', lambda w: gtk.main_quit())
sw = gtk.ScrolledWindow()
w.add(sw)
sw.add(iv)
w.show_all()
gtk.main()
最好的方法是要么继续使用表格并重新实现选择功能,要么使用一个自定义的IconView版本,配合一个可以使用gtk.HBox()的自定义单元渲染器。
关于自定义单元渲染器的一些指导原则是:
http://faq.pygtk.org/index.py?req=show&file=faq13.045.htp
http://faq.pygtk.org/index.py?req=show&file=faq13.056.htp
在pygtk邮件列表上有过讨论:
htp://old.nabble.com/Drawing-widgets-in-a-custom-cellrenderer-td14207692.html
WWWalter提供了一个示例代码: http://www.translate.org.za/blogs/walter/en/content/conquering-cellrendererwidget
根据Ruben Vermeersch的说法,f-pot使用了一个修改过的IconView版本。代码可以在这里找到: http://git.gnome.org/browse/f-spot/?h=icon-view-cleanup