可以把GtkTreeView像GtkIconView那样绘制吗?

2 投票
2 回答
1742 浏览
提问于 2025-04-16 03:27

我正在用Python开发一个GTK+应用程序,使用的是PyGtk。我的应用主要是用来管理视频的,就像F-spot或Picasa,但它是专门为视频设计的。

在这两个应用中,你会看到一个中央区域,可以看到所有的照片,下面还有标签缩略图。

在我的应用里,我想实现类似的视图。目前我只是简单地使用了这个:

一个gtk.Table,里面有一个VBox,在VBox里有一个Pixbuf(我的视频缩略图),还有一个HBox,在HBox里放了尽可能多的Pixbuf作为标签。

这样是可以工作的,但看起来很丑,而且似乎不是最好的解决方案。

我仔细查看了文档,发现有两个小部件比较符合我的需求:IconViewTreeView。但是IconView每一行只能显示一个缩略图,而TreeView则不能像IconView那样以网格形式显示。

我的问题是:有没有办法让TreeViewIconView一样以网格形式显示?你会如何实现F-spot那种排列照片和标签的方式呢?

2 个回答

1

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()
0

最好的方法是要么继续使用表格并重新实现选择功能,要么使用一个自定义的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

撰写回答