如何通过具有备用功能的GIcon创建GtkImage?

时间:2018-11-23 05:04:40

标签: gtk gtk3 pygobject

我有一个Gio.Icon(或C中的GIcon,我正在使用pygobject)。现在,我正在使用以下代码从Gio.Icon创建一个Gtk.Image:

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是否显示为损坏的图像?

编辑

一个最小的例子:

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 :(得分:1)

我在GtkImage documentation中找到了答案:

  

如果文件未成功加载,则该图像将包含一个“残破的图像”图标,类似于许多网络浏览器中使用的图标。如果要处理自己加载文件时的错误(例如,通过显示错误消息),请使用gdk_pixbuf_new_from_file()加载图像,然后使用gtk_image_new_from_pixbuf()创建GtkImage。

尽管如此,我实际上需要使用GtkIconTheme而不是gdk_pixbuf_new_from_file来获取PixBuf:

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