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.
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/")
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()
... 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()