Возможно ли нарисовать GtkTreeView, указанный как GtkIconView?

Я работаю над приложением GTK+, написанным на python. Я, очевидно, использую PyGtk. Мое приложение посвящено коллекциям видео. Это что-то вроде F-spot или Picasa, но для видео.

Как вы можете видеть в этих двух приложениях, у вас есть центральная область, где вы можете видеть все свои фотографии с миниатюрами тегов под ними.

В моем приложении я хочу реализовать такое же представление. Пока я просто использую это:

gtk.Table, содержащий VBox, внутри VBox Pixbuf (миниатюра моего видео) и HBox, а внутри HBox столько Pixbuf, сколько тегов.

Это работает, но это уродливо, и кажется, что это не лучшее решение.

Покопавшись в документах, я нашел два виджета рядом с моими потребностями: IconView и TreeView. Но IconView может отображать только один pixbuf на «строку», а TreeView не отображает сетку, как IconView.

Мой вопрос: есть ли способ отобразить TreeView как IconView (в сетке)? Как бы вы реализовали способ размещения фотографий и тегов под F-spot?


person boblefrag    schedule 29.08.2010    source источник
comment
Я сам не вникал в это, но похоже, что можно реализовать пользовательские CellRenderer и pack_end в IconView?   -  person bobince    schedule 30.08.2010


Ответы (2)


IconView это то, что вам нужно. В ListStore каждая строка представляет только один pixbuf, но 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()
person mg.    schedule 31.08.2010
comment
возможно, я недостаточно ясно объясняю: я уже могу отобразить миниатюру видео в IconView, но я не могу отобразить в той же ячейке миниатюру видео и пометить миниатюру относительно нее. Для лучшего объяснения вы можете просто взглянуть на пользовательский интерфейс f-spot. Вот почему я ищу модель дерева/дерево, где вы можете определить родителей и детей. родители для моей миниатюры видео, дочерние для каждой прикрепленной к ней миниатюры тега. К сожалению, древовидное представление не может отображаться в виде сетки, такой как IconView. - person boblefrag; 31.08.2010
comment
Извините, но я не могу понять, что такое миниатюра тега. Можешь лучше объяснить? Разве это не ярлык для миниатюры? - person mg.; 31.08.2010
comment
Обязательно возьмите сетку, в каждую ячейку поставьте фото, это миниатюра моего видео. Под каждой миниатюрой видео поместите несколько фотографий меньшего размера, выровненных в ряд: это мой тег миниатюр. - person boblefrag; 01.09.2010
comment
Хорошо, я попробовал f-spot, и он расширяет gtk.Layout для реализации своего значка. Если вы не хотите идти по тому же пути, самый простой способ, который приходит мне в голову, — это динамически создать новое изображение (с помощью imagemagick), которое содержит миниатюру тега, и использовать стандартный gtk.IconView. - person mg.; 01.09.2010
comment
Я тоже думал об этом, с PIL, но, ну, признайтесь, это дурно пахнет ... Пока я придерживаюсь текстового тега, а не тега эскизов. Когда я буду чувствовать себя достаточно комфортно с pytgk, я попробую взломать это. То, что я хотел бы сделать, но я не знаю, как взять идею bobince и сделать макет CellRenderer, который может использовать gtk.Hbox(). - person boblefrag; 01.09.2010
comment
@мг. Этот пример действительно удивителен! Спасибо, что поделился. - person mnrl; 29.08.2013

Лучший подход — либо придерживаться таблицы и переопределить выбор, либо использовать пользовательскую версию 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:

http://old.nabble.com/Drawing-widgets-in-a-custom-cellrenderer-td14207692.html

WWWalter сделал пример кода: http://www.translate.org.za/blogs/walter/en/content/conquering-cellrendererwidget

По словам Рубена Вермеерша, f-pot использует модифицированную версию IconView. Код можно найти здесь: http://git.gnome.org/browse/f-spot/?h=icon-view-cleanup

person boblefrag    schedule 02.09.2010