Как я могу создать GtkImage из GIcon с запасным вариантом? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть Gio.Icon (или GIcon в C, я использую pygobject).Прямо сейчас я использую следующий код для создания Gtk.Image из Gio.Icon:

image = icon and Gtk.Image(gicon=icon, icon_size=Gtk.IconSize.DIALOG, pixel_size=48, use_fallback=True)

Проблема в том, что Gio.Icon не гарантируется правильное имя иконки /путь и когда это не так, он показывает значок разбитого изображения.Я бы хотел использовать другой значок, который, как я знаю, существует, если поставляемый Gio.Icon недействителен.Есть ли какой-нибудь способ узнать, является ли Gio.Icon недействительным или Gtk.Image будет отображаться как разорванное изображение?

EDIT

Минимальный пример:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio

win = Gtk.Window()
win.connect('destroy', Gtk.main_quit)

icon = Gio.Icon.new_for_string('gnome-garbage')
fallback_icon = Gio.Icon.new_for_string('folder')
image = Gtk.Image(gicon=icon, icon_size=Gtk.IconSize.DIALOG, pixel_size=48)
win.add(image)

win.show_all()
Gtk.main()

1 Ответ

0 голосов
/ 27 ноября 2018

Я нашел ответ в документации GtkImage :

Если файл не был успешно загружен, изображение будет содержать значок «испорченное изображение», аналогичный используемомуво многих веб-браузерах.Если вы хотите обрабатывать ошибки при загрузке файла самостоятельно, например, отображая сообщение об ошибке, затем загрузите изображение с помощью gdk_pixbuf_new_from_file (), а затем создайте GtkImage с помощью gtk_image_new_from_pixbuf ().

Хотя вВ моем случае мне действительно нужно использовать GtkIconTheme, чтобы получить PixBuf вместо gdk_pixbuf_new_from_file:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio

win = Gtk.Window()
win.connect('destroy', Gtk.main_quit)

def load_icon(icon):
    info = Gtk.IconTheme.get_default().lookup_by_gicon(icon, 48, Gtk.IconLookupFlags.FORCE_SIZE)
    if info:
        return info.load_icon()

icon = Gio.Icon.new_for_string('gnome-garbage')
fallback_icon = Gio.Icon.new_for_string('folder')

pixbuf = load_icon(icon) or load_icon(fallback_icon)
image = Gtk.Image.new_from_pixbuf(pixbuf)
win.add(image)

win.show_all()
Gtk.main()
...