web-dev-qa-db-fra.com

Comment programmer une icône d'état qui s'affichera dans Ubuntu ainsi que dans d'autres distributions?

L'application en question effectue une action (ici, la connexion de l'audio aux flux réseau) et s'exécute minimisée si ces actions aboutissent. Par conséquent, une icône d'état est nécessaire pour afficher l'état de la connexion (par exemple, CONNECTED/DISCONNECTED). Lorsque vous cliquez sur l'icône, la fenêtre de l'application s'ouvre pour vous permettre d'accéder à d'autres options.

En utilisant Python 2.6 et pyGtk, j’ai facilement réalisé cela en utilisant gtk_status_icon . J'ai délibérément écrit l'application pour qu'elle s'exécute sur autant de distributions que possible, y compris les différentes versions d'Ubuntu. J'ai pris soin d'utiliser des dépendances possibles seulement après que l'utilisateur les ait installées.

Cependant, j'entends maintenant que gtk_status_icon ne sera plus pris en charge dans les futures versions d'Ubuntu. Les développeurs sont invités à utiliser les indicateurs d'application à la place. Quelle est alors la meilleure pratique pour s’assurer que:

  1. Les icônes locales de l'application sont affichées correctement
  2. L'application fonctionnera toujours et affichera ses icônes dans les prochaines versions d'Ubuntu.
  3. L'application s'exécutera également et affichera ses icônes dans les autres environnements où indicateur-applet , libappindicator , et python-appindicator ne sont pas fournis.

Les mécanismes de secours de l'indicateur d'application à gtk_status_icon ne fonctionneront pas si indicateur-applet n'est pas en cours d'exécution. Python les interprètes ne fonctionneront pas s'il n'y avait pas de module appindicator à importer. Dois-je développer différentes versions pour différentes distributions ou existe-t-il un meilleur moyen de contourner ce problème?.

Où puis-je trouver une documentation sur la façon d'utiliser ApplicationIndicator autrement que dans l'exemple donné dans buntu Wiki ? Quelles commandes sont fournies pour vérifier si indicateur-applet est en cours d'exécution afin d'éviter de programmer des codes sources différents pour les distributions Ubuntu par rapport aux distributions non-Ubuntu?

23
Takkat

Je pense que la nécessité ici est en fait plus de déterminer la bibliothèque python-appindicator est présente. S'il est présent, il supportera tous les cas de repli dont vous avez besoin. Il gérera correctement XFCE, KDE et les versions antérieures de GNOME. Bon exemple de la façon de le faire dans cette réponse .

La bibliothèque appindicator utilisera DBus pour vérifier si le processus de rendu des indicateurs d'application est disponible. Ce sera le cas sur Unity ou si l'applet-indicateur est en cours d'exécution. S'il est disponible, il l'utilisera, sinon, il utilisera un GtkStatusIcon avec le même menu.

Malheureusement, je pense que vous devrez conserver les deux chemins de code si vous souhaitez gérer le cas où la bibliothèque n'est pas disponible. Cependant, nous serions heureux d'aider la bibliothèque dans d'autres distributions :)

16
Ted Gould

J'ai une excellente solution qui a bien fonctionné dans StackApplet - J'ai créé une version du module appindicator fonctionnellement équivalente qui utilise gtk.StatusIcon en interne pour fournir une fonctionnalité identique lorsque le module réel n'existe pas.

Son utilisation est aussi simple que:

  1. Téléchargez le fichier suivant et appelez-le appindicator_replacement.py
  2. Ajouter les éléments suivants à votre application:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator
    

Voilà! Votre application fonctionnera parfaitement, avec ou sans assistance pour AppIndicators. Il fonctionnera même sous Windows, à condition que vous n'ayez aucun autre code spécifique à la plate-forme.


Remarque: le fichier est publié sous la licence MIT - vous pouvez donc l'utiliser à peu près pour n'importe quoi.

10
Nathan Osman

Vous devrez écrire du code pour les deux. Vous pouvez détecter la présence d'appindicator dans votre code Python à l'aide de quelque chose de similaire à:

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

A partir de là, utilisez have_appindicator pour décider si vous devez utiliser le code appindicator ou le code gtk_status_icon.

Malheureusement, cela signifie également que vous aurez besoin de tester à la fois Ubuntu et un autre environnement.

9
jgoguen
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

De cette façon, vous pouvez détecter si l'applet indicateur est en cours d'exécution. Vous n'avez pas besoin de vous inquiéter pour Ubuntu 11.04 car ce ne sera pas le cas. Il n'y a pas de scénario de secours, car indicateur-applet est un composant obligatoire, exécuté par défaut.

3
OpenNingia