web-dev-qa-db-fra.com

Définir l'icône de la fenêtre sur l'icône Gtk Stock dans PyGtk

J'essaie d'ajouter une icône de stock Gtk à ma fenêtre. Voici le code:

#! /usr/bin/python

from gi.repository import Gtk

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title='My Window Title')

        self.icon = self.render_icon(Gtk.STOCK_FLOPPY, 1)
        self.set_icon(self.icon)

        self.connect('delete-event', Gtk.main_quit)

win = MyWindow()
win.show_all()
Gtk.main()

Selon cette page la taille de l'icône doit être l'une des constantes de taille d'icône Gtk mais l'achèvement du code Eclipse ne présente aucune des valeurs répertoriées. Si j'entre manuellement l'une de ces valeurs, je obtenir

AttributeError: l'objet 'gi.repository.Gtk' n'a pas d'attribut 'ICON_SIZE_SMALL_TOOLBAR'

Si je règle la taille de l'icône au littéral 1, le script fonctionne. Je suis sûr que cela doit faire quelque chose avec les versions de Gtk ou PyGtk, mais je ne peux pas comprendre ce que je fais mal. Merci d'avance et désolé pour la question des novices.

2
Anonimista

Le problème est que vous consultez la documentation PyGTK, mais que vous utilisez PyGI/GTK3 dans votre script.

La documentation sur gtk_widget_render_icon() dit ce qui suit:

gtk_widget_render_icon est obsolète depuis la version 3.0 et ne doit pas être utilisé dans du code nouvellement écrit. Utilisez plutôt gtk_widget_render_icon_pixbuf ().

Ensuite, la documentation sur gtk_widget_render_icon_pixbuf() dit ceci:

gtk_widget_render_icon_pixbuf est obsolète depuis la version 3.10 et ne doit pas être utilisé dans du code nouvellement écrit. Utilisez plutôt gtk_icon_theme_load_icon ().

Génial hein? Alors passons.

gtk_icon_theme_load_icon() prend les arguments suivants:

  • icon_name: le nom de l'icône à rechercher
  • taille: la taille de l'icône souhaitée. L'icône obtenue peut ne pas être exactement de cette taille
  • flags: drapeaux modifiant le comportement de la recherche d'icône

Sachant cela, vous pouvez modifier votre ancienne ligne render_icon comme suit:

        icontheme = Gtk.IconTheme.get_default()
        self.icon = icontheme.load_icon(Gtk.STOCK_FLOPPY, 128, 0)

Ce qui va chercher une image de 128x128 px. Vous voudrez peut-être changer les drapeaux si nécessaire, l'énumération est documentée ici . Cela peut être traduit en Python comme ceci:

GTK_ICON_LOOKUP_NO_SVG -> Gtk.IconLookupFlags.NO_SVG
GTK_ICON_LOOKUP_FORCE_SVG -> Gtk.IconLookupFlags.FORCE_SVG
GTK_ICON_LOOKUP_USE_BUILTIN -> Gtk.IconLookupFlags.USE_BUILTIN
# And so on...
8
Timo