web-dev-qa-db-fra.com

AppIndicator3: Définir l'icône de l'indicateur à partir du nom de fichier ou de GdkPixbuf

J'écris un petit Python 3 app qui utilise AppIndicator3 pour placer une icône dans la barre supérieure, puis modifie cette icône en réponse aux actions de l'utilisateur. Simple, non? Parce que l'application est petite, elle doit être exécutée à partir de son répertoire source sans aucune installation.

Le problème est que AppIndicator3.set_icon() nécessite un str avec un nom d'icône et non un chemin d'accès à cette icône.

Comment puis-je persuader AppIndicator3 de me laisser lui donner un nom de fichier ou un Pixbuf? Sinon, comment puis-je ajouter mon répertoire d'icônes au chemin de recherche de noms d'icônes? (J'ai essayé AppIndicator3.set_icon_theme_path(), mais les noms de mes icônes ne sont toujours pas reconnus.

5
Scott Severance

Pour utiliser un chemin d'accès à l'icône, voici un exemple. Dans l'exemple ci-dessous, je conserve les icônes dans le même répertoire que le script (indicateur), ce qui semble une solution pratique dans votre cas.

En bout de ligne, une fois que vous avez initié votre indicateur:

class Indicator():
    def __init__(self):
        self.app = "<indicator_name>"
        iconpath = "/path/to/initial/icon/"

        -------------------------------

        self.testindicator = AppIndicator3.Indicator.new(
        self.app, iconpath,
        AppIndicator3.IndicatorCategory.OTHER)

        -------------------------------

vous pouvez changer l'icône avec:

        self.testindicator.set_icon("/path/to/new/icon/")

enter image description hereenter image description here

Exemple

Dans l'exemple ci-dessous, toutes les icônes, nocolor.png, purple.png et green.png sont stockées avec le script, mais le chemin d'accès aux icônes, défini dans

currpath = os.path.dirname(os.path.realpath(__file__))

pourrait être n'importe où.

#!/usr/bin/env python3
import os
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3

currpath = os.path.dirname(os.path.realpath(__file__))

class Indicator():
    def __init__(self):
        self.app = 'show_proc'
        iconpath = currpath+"/nocolor.png"
        # after you defined the initial indicator, you can alter the icon!
        self.testindicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.testindicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.testindicator.set_menu(self.create_menu())

    def create_menu(self):
        menu = Gtk.Menu()
        item_quit = Gtk.MenuItem(label='Quit')
        item_quit.connect('activate', self.stop)
        item_green = Gtk.MenuItem(label='Green')
        item_green.connect('activate', self.green)
        item_purple = Gtk.MenuItem(label='Purple')
        item_purple.connect('activate', self.purple)
        menu.append(item_quit)
        menu.append(item_green)
        menu.append(item_purple)
        menu.show_all()
        return menu

    def stop(self, source):
        Gtk.main_quit()

    def green(self, source):
        self.testindicator.set_icon(currpath+"/green.png")

    def purple(self, source):
        self.testindicator.set_icon(currpath+"/purple.png")

Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Remarque

... que si vous devez mettre à jour l'icône à partir d'un deuxième fil , vous devez utiliser

GObject.threads_init()

avant

Gtk.main()

et vous devez mettre à jour l'interface (icône ou texte d'indicateur) en utilisant:

GObject.idle_add()

tel qu'appliqué par exemple ici et ici .

5
Jacob Vlijm