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

23

L'application en question effectue certaines actions (ici la connexion audio aux flux réseau) et s'exécute de manière minimale si ces actions ont réussi. Par conséquent, une icône d'état est nécessaire pour afficher l'état de la connexion (par exemple CONNECTED / DISCONNECTED). Ce n'est qu'en cliquant sur l'icône que la fenêtre de l'application s'ouvrira pour donner accès à d'autres options.

En utilisant Python 2.6 et pyGtk, j'ai réalisé cela en utilisant gtk_status_icon . J'ai délibérément écrit l'application pour qu'elle fonctionne sur autant de distributions que possible, y compris les différentes versions d'Ubuntu. J'ai pris soin d'utiliser les dépendances possibles uniquement après que l'utilisateur les a 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 s'affichent correctement
  2. L'application continuera de fonctionner et affichera ses icônes dans les futures versions d'Ubuntu.
  3. L'application s'exécutera également et affichera ses icônes dans d'autres environnements où indicateur-applet , libappindicator et python-appindicator ne sont pas fournis.

Les mécanismes de secours des indicateurs d'application vers gtk_status_icon ne fonctionneront pas si l' indicateur-applet n'est pas en cours d'exécution. Les interprètes Python ne s'exécuteront pas s'il n'y avait pas de module d' indicateur à partir duquel importer. Dois-je développer différentes versions pour différentes distributions ou existe-t-il un meilleur moyen de contourner cela.

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

Takkat
la source

Réponses:

16

Je pense que le besoin ici est en fait plus déterminant de la bibliothèque python-appindicator qui est présente. S'il est présent, il prendra en charge tous les cas de secours dont vous avez besoin. Il gérera correctement XFCE, KDE et les anciens GNOME. Bon exemple de la façon de le faire dans cette réponse .

La bibliothèque d'indicateurs 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 reviendra à utiliser un GtkStatusIcon avec le même menu.

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

Ted Gould
la source
Merci pour cette réponse très claire. Cela indique le chemin que je devrai emprunter si je veux que mon application s'exécute en 11.04. J'ai un chemin de travail pour GtkStatusIcon mais devra développer le tout à nouveau pour indicateur-applet. Si j'ai compris votre commentaire sur le bug # 668375, je peux éventuellement utiliser mes icônes locales sans avoir à créer un thème d'icônes entier, puis-je?
Takkat du
Ayant eu le temps de plonger dans la programmation AppIndicator, j'ai trouvé que l'utilisation de la suggestion de jgoguen pour vérifier le module appindicator n'aide pas vraiment, car les icônes personnalisées ne s'afficheront pas dans 10.04 LTS. Voir mes commentaires sur le bug # 668375.
Takkat
Ma réponse comprend un moyen très simple de résoudre ce problème. Cela a très bien fonctionné pour mon application et a même rendu indolore le portage d'une application qui utilise AppIndicators vers Windows!
Nathan Osman
10

J'ai une excellente solution qui a bien fonctionné dans StackApplet - J'ai créé une version fonctionnellement équivalente du appindicatormodule qui utilise en gtk.StatusIconinterne pour fournir des fonctionnalités identiques lorsque le vrai module n'existe pas.

Son utilisation est aussi simple que:

  1. Téléchargement du fichier suivant et appelez-leappindicator_replacement.py
  2. Ajout de ce qui suit à votre application:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

C'est ça! Désormais, votre application fonctionnera parfaitement avec ou sans prise en charge d'AppIndicators. Il s'exécutera même sous Windows, en supposant que vous n'avez pas d'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.

Nathan Osman
la source
9

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

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

À 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 devrez avoir à la fois un Ubuntu et un autre environnement pour tester.

jgoguen
la source
1
Pourtant, il peut y avoir des environnements où python-appindicator est installé mais l' applet indicateur n'est pas en cours d'exécution. L'application devrait également gérer cela.
Takkat
Pour ce cas, voir wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Fallbacks personnalisés. Par défaut, vous obtiendrez un gtk.StatusIcon pour l'indicateur d'application s'il n'y a pas d'applet d'indicateur présent.
htorque
Je connais l'option de secours. Ce que je ne comprends pas, c'est que si indicateur-applet ne fonctionne pas, comment indicateur-applet peut-il fournir une solution de rechange?
Takkat
J'imagine qu'il vérifie simplement l'indicateur-applet et fournit la fonctionnalité gtk_status_icon dans les coulisses.
jgoguen
1
@jgoguen: qu'est-ce que "c'est"? Je comprends qu'à partir de la version 11.04, Ubuntu / Unity ne prendra plus en charge gtk_status_icon. D'autres distributions peuvent ne pas avoir "it". Je suis vraiment inquiet à ce sujet.
Takkat
3
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 à vous soucier d'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.

OpenNingia
la source
Merci de votre pointage pour obtenir le PID d'indicateur-applet (je le fais déjà pour d'autres dépendances possibles en utilisant pidof), ce serait un moyen certes moins élégant si rien de mieux n'était disponible. Autant que je puisse voir, l'indicateur-applet fonctionne de manière fiable avec l'unité uniquement si les exigences matérielles sont remplies. Les utilisateurs pourront démarrer dans 2D GNOME et pourraient décider de ne pas exécuter indicateur-applet. Cependant, cela peut ne pas être dû à mon problème.
Takkat
Je suis d'accord avec vous que ce n'est peut-être pas «élégant» (mais vous pouvez ajouter tous les cosmétiques que vous voulez: D) mais cela devrait fonctionner. Personnellement, je préfère les solutions qui fonctionnent bien et l'élégance vient en deuxième position :)
OpenNingia
Cette tâche ne semble pas s'exécuter sur mon système 14.04. L'approche a-t-elle été remplacée? Il y a beaucoup de /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-servicetâches à la place.
licol