代码之家  ›  专栏  ›  技术社区  ›  Thayne

我怎样才能从一个gicon创建一个gtkimage而不需要回退呢?

  •  0
  • Thayne  · 技术社区  · 6 年前

    我有一个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.图标是否无效,或者gtk.图像是否显示为损坏的图像?

    编辑

    一个简单的例子:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Thayne    6 年前

    我在 GtkImage documentation :

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

    不过,在我的情况下,我实际上需要使用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()
    
    推荐文章